ふらっと C#,C♯,C#(初心者用) Part144

■ このスレッドは過去ログ倉庫に格納されています
2019/07/16(火) 15:36:23.74ID:i1fbuZ/pM
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)

「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■関連スレ
C#, C♯, C#相談室 Part95
https://mevius.5ch.net/test/read.cgi/tech/1508168482/

■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/
■前スレ
ふらっと C#,C♯,C#(初心者用) Part143
https://mevius.5ch.net/test/read.cgi/tech/1558002486/

■情報源
https://docs.microsoft.com/ja-jp/dotnet/standard/class-libraries
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://docs.microsoft.com/en-us/dotnet/standard/class-libraries
http://referencesource.microsoft.com/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
721デフォルトの名無しさん (ワッチョイ ae2d-Z796)
垢版 |
2019/09/21(土) 14:57:58.99ID:8edEcM0R0
すまんが、スレッドを指定して実行ってできないもんなの?
指定できればロックが必要な箇所が減っていい気がするんだけど・・・・どうなんだろう
2019/09/21(土) 15:03:52.53ID:gZFDeRYs0
スレッド起動しないかWaitしておけば、
良いんじゃね
2019/09/21(土) 15:21:35.32ID:Ef6g+Zfma
>>721
Producer-Consumerパターンを使って特定スレッドでだけ処理するのはどう?
BlockingCollection<T>使うと楽に実装できるよ
2019/09/21(土) 15:59:40.26ID:3kDOCDXv0
Dllimortで呼び出す関数の引数にはジェネリックは使えないのでしょうか?
2019/09/21(土) 17:32:33.11ID:CRAyGleP0
使えない
726デフォルトの名無しさん (アウアウウー Sa85-dxf9)
垢版 |
2019/09/21(土) 17:41:38.79ID:dMKiDHPTa
>>724
どんな使い方を想定してるの?
っていうかそれ、呼び出されたアンマネージド関数側はどうしたらいいの?www
2019/09/21(土) 17:50:18.96ID:GoVsp8loa
>>726
.NETのジェネリックは実行時に特殊化されるから、技術的にはそんなに無茶な話ではないよ
2019/09/21(土) 17:57:47.91ID:rw4WtgZd0
まあどのみち今のところできないから、いんぽ関数自体はIntPtrで受け取って
Marshal.PtrToStructureとかでごにょごにょするジェネリック関数でラップする感じでやるしかないね
SystemParametersInfoとかでそういう欲求があること自体はわかる
2019/09/21(土) 17:59:11.73ID:ox/L2PXG0
>>727
それじゃ質問者に回答してやってくれ
2019/09/21(土) 18:12:58.46ID:GoVsp8loa
>>729
質問者を馬鹿にするほどには突飛な発想ではないということだよ
.NETのジェネリックがどのように実装されているかを知っていれば、できてもいいと考えてもおかしくはない
731デフォルトの名無しさん (アウアウウー Sa85-dxf9)
垢版 |
2019/09/21(土) 18:32:15.65ID:dMKiDHPTa
十分突飛だと思いますけどね。

これ、アンマネージドに限らない。
マネージドだろうが、他のアセンブリで既に定義されてる
非ジェネリックなstaticメソッドをジェネリック化したいと言ってるのと同じ。

だから、呼ばれた側は何すりゃいいんだよw
2019/09/21(土) 18:43:55.34ID:GoVsp8loa
>>731
CのAPIだと、サイズが同一の異なる型を一緒に扱ったり、条件に応じてポインタの指す型の解釈を変えたりとか珍しくないでしょ
733デフォルトの名無しさん (アウアウウー Sa85-dxf9)
垢版 |
2019/09/21(土) 18:44:55.69ID:dMKiDHPTa
>>732
そういうのは共用体とかオーバーロードで解決できるでしょ。
ジェネリックを使うって発想は意味不明だよ
2019/09/21(土) 18:46:58.39ID:3kDOCDXv0
>>726
具体的にはLPVOID引数で自己責任ながら参照型からref、outやintなどの値渡しまで色々な型のオーバーロードを作って実際にちゃんと機能しています
なので一々オーバーロードとそのラップだけで30行ほど使ってしまってる現状が無駄に思えてどうにか方法ないかなと
2019/09/21(土) 19:46:47.84ID:rw4WtgZd0
一例としてはこんな感じ

APIの想定される構造体がBlittableのみならマーシャリング不要なので
unmanaged制約にしてアドレス渡しの方が効率は良い

public static T GetSystemParametersInfo<T>(SPI uiAction, uint uiParam, SPIF fWinIni) where T : struct {
  T value;
  var buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf<T>());
  SystemParametersInfo(uiAction, uiParam, buffer, fWinIni);
  value = Marshal.PtrToStructure<T>(buffer);
  Marshal.FreeCoTaskMem(buffer);
  return value;
}

まあぶっちゃけお行儀的にはオーバーロードだらだら並べる方が正解ではあるんだけどねw
2019/09/21(土) 19:58:38.68ID:A1p2bytl0
c# で必殺技みたいなメソッドがあったのですが思い出せません。どなたかご存知ないでしょうか?
2019/09/21(土) 20:03:15.85ID:y68BphyG0
>>736
リフレクション?
2019/09/21(土) 22:34:09.60ID:rnFOOH9a0
>>736
privateメソッドを外部から無理矢理呼び出すやつ?
2019/09/21(土) 22:42:59.80ID:70YMyRx+a
リフレクションならDynamicInvoke()がなんともかっこいいメソッド名
>>736のはおそらくはデストラクタあたりを想定してるんじゃないかと思うけど
2019/09/21(土) 23:13:56.71ID:GoVsp8loa
DangerousAddRefもなかなか
2019/09/22(日) 01:11:49.71ID:YKAr5fZO0
>>736
オーバーライド!!
2019/09/22(日) 01:26:33.02ID:01VTDUEXM
オーバーロード!!
2019/09/22(日) 01:39:55.72ID:V8FjsYeid
>>736
ラムダ式!
2019/09/22(日) 07:51:48.39ID:Wx+hr3d10
>>718
>>719
さんきう
とある製品のRDBMSのSQLに独自の書き方やら関数やら記法やらが混じってるからなんとかしたかったんだけどライブラリとやらを使えばいけるのかな。
2019/09/22(日) 08:33:40.66ID:6LYYKR960
1) githubで"sql parser"と検索
2) C#で絞り込む
3) 上から順に試す
4) 好みのが見つかったら改造を試みる

少なくとも1から作るよりは圧倒的に楽だし勉強にもなるよ
2019/09/22(日) 09:28:54.26ID:p/RNYxc40
>>726
dllってことは既にasm化されてるんだから型なんて関係なく受け取ったもんを問答無用でバイナリとして処理するだけだろ
C#はそういうのをコーディング段階で防いでるだけであって
747デフォルトの名無しさん (アウアウウー Sa85-dxf9)
垢版 |
2019/09/22(日) 12:11:14.62ID:PittLpUUa
>>746
〜だろ
馬鹿ほどぞんざいで偉そうな口調なのは法則なのかねwww
748デフォルトの名無しさん (アウアウウー Sa85-dxf9)
垢版 |
2019/09/22(日) 12:16:38.76ID:PittLpUUa
少なくともC#のジェネリックはstringとbyte[]を透過的に扱ったり、
longをint2つと透過的に扱ったりするための仕組みじゃありませんwww

だからそういうのは共用体やオーバーロードを使うんだってw
2019/09/22(日) 12:28:14.42ID:GskCdwYSM
端的に答えとけばいいんだよ
余計な講釈を垂れるな
2019/09/22(日) 22:36:43.63ID:584djEVu0
BitmapをBitmapDataにしたいのですが、使用されたパラメータが有効ではありませんと言われてしまいます。
ファイルから読み込んだbitmapは変換できるのですが、このようにコード上で作ったbitmapはダメです。
何がいけないのでしょうか?

Bitmap trimBmp = baseBmp.Clone(rect, baseBmp.PixelFormat);
BitmapData bitData = trimBmp.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
2019/09/22(日) 22:44:27.94ID:6/LwH+kT0
rectで切り出した後、その切り出した後のビットマップから
さらにrectで一部分のロックしようとしてるけど大丈夫? 全面じゃない?
2019/09/22(日) 22:53:39.23ID:584djEVu0
>>751
baseBMPからrectで切り抜いてますが、trimBMPにとってはrectは全面だと思うのですがダメなのですかね?

でも
Bitmap bmp = new Bitmap(100,100)
みたいな素画像でもやっぱりLockBitsできないです
2019/09/22(日) 23:53:45.92ID:yl5BH+I+0
>>752
>trimBMPにとってはrectは全面
ではなくbaseBmpのrectの範囲って自分で指定しているよね
BitmapData bitData = trimBmp.LockBits(new Rectangle(0, 0, trimBmp.Width, trimBmp.Height), ImageLockMode.ReadOnly, trimBmp.PixelFormat);
>Bitmap bmp = new Bitmap(100,100)
>みたいな素画像でもやっぱりLockBitsできないです
できる。そっちもちゃんと引数の指定してみて
2019/09/23(月) 01:34:07.15ID:CAyWI0VB0
private Point CalcPopupLoction(Form launcher, Form popupForm) {}

ボタン押したときに上部に表示する モーダルな popup フォーム の位置を計算するメソッドを書きました。

ボタンが左の方にあると、親フォームの左枠をはみ出さないように、popupForm は左揃えで表示。
真ん中へんにあると中央揃え、右端ならボタンとpopupForm を右揃えで表示する感じです。

1つ目の引数の良い名前が思い付きません。
主にボタンを想定してる引数です。
launcher (発射台)はどうもしっくりきません。
parent や baseForm はなんかおかしいのでやめました。
755デフォルトの名無しさん (アウアウウー Sa85-dxf9)
垢版 |
2019/09/23(月) 03:14:26.31ID:QdBzCxoka
>>754
そもそもそんなメソッドいらんでしょ。

ポップアップがどこに表示されるべきかはボタンを持つFormが知っているんだから
そいつに聞く(そいつのプロパティーとして実装)のが一番
756デフォルトの名無しさん (アウアウウー Sa85-dxf9)
垢版 |
2019/09/23(月) 03:28:32.57ID:QdBzCxoka
あー、右に揃える場合もあるのね。
じゃあボタン持ってるFormに

void ShowModalPopup(Form popup)
みたいなメソッドを持たせればいい
2019/09/23(月) 03:42:05.85ID:ltbH9/U50
こういう使い回しが効きそうなのはいちいちフォームに実装しないで拡張メソッドにでもした方が
758デフォルトの名無しさん (アウアウウー Sa85-dxf9)
垢版 |
2019/09/23(月) 03:56:41.99ID:QdBzCxoka
本当はボタン持ってる方のFormに
interface IDialogOwner:IWin32Window
{
  HorizontalAlignment DialigHAlignment { get; }
  Rectangle Rectangle { get; }
}
みたいなのをかぶせて、Popupする方のFormでShowDialogをオーバーロードして
void ShowDialog(IDialogOwner owner)
みたいにするのがいいのかも。

酔っぱらってるんでよく分からなくなってきたw
759デフォルトの名無しさん (ワッチョイ a211-2BIS)
垢版 |
2019/09/23(月) 08:49:12.84ID:l2jPGLgc0
C#でawaitに対応していないメソッドをawaitで非同期実行できるようにする方法を教えてください.

以下のようにしてもActionが実行されませんでした.
private async static void SomeHandler()
{
Console.Write("Burn");

await new Task(new Action(() =>{
Console.Write("[Start]");
Thread.Sleep(2000);
Console.Write("[Completed]");
}));

Console.Write("End");
}
2019/09/23(月) 08:58:35.82ID:ZRlL2jPD0
https://docs.microsoft.com/ja-jp/dotnet/api/system.threading.tasks.task?view=netframework-4.8#creating-and-executing-a-task
761デフォルトの名無しさん (アウウィフ FF85-9GzD)
垢版 |
2019/09/23(月) 12:17:14.67ID:3qdqqJ07F
bitmapinfo とか
dibsection とか
bitmapinfoheader とか
勉強してみたら
2019/09/23(月) 14:47:11.75ID:vpc5pW+6d
>>759
TaskCompletionSourceだっけ?うろ覚えですまんが、jsのPromiseオブジェクト的に使える。
2019/09/23(月) 15:20:09.58ID:LbTjUCX60
taskをstartしてないだけだから...
764デフォルトの名無しさん (ワッチョイ c135-2BIS)
垢版 |
2019/09/23(月) 15:46:49.67ID:s6/Kehza0
>>763
ありがとうございます!
2019/09/23(月) 18:09:27.70ID:7f5aVpAAd
どういたしまして!
2019/09/23(月) 19:11:24.16ID:24/7TZbh0
ID:QdBzCxoka
何の話してんのこの人
>>754
変数名が思いつかないとかはこのスレじゃなく
クラス名・変数名に迷ったら書き込むスレ。Part28 [無断転載禁止]©2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1494147712/
767デフォルトの名無しさん (アウアウウー Sa85-dxf9)
垢版 |
2019/09/23(月) 22:40:56.88ID:6ZQTgZjHa
>>766
交通整理バカw
設計が間違ってるのに名前付けて何の意味がある
2019/09/23(月) 22:48:38.96ID:CAyWI0VB0
>>766
レスありがとうございます。
そんなスレあるの知らなかった。
2019/09/23(月) 23:35:14.83ID:CAyWI0VB0
>>754
private Point CalcPopupLoction(Form launcher, Form popupForm) {}

上記は下部のボタンの位置に応じて、大きさのことなるpopupForm の表示位置を計算するメソッド

exportButton_Click 内で、
ShowDialog(); で表示する popupForm に戻り値を設定

https://i.imgur.com/ggjo4td.jpg
2019/09/24(火) 00:01:07.45ID:OEzHH54a0
>>754
・Loctionて何
・ボタンの置いてあるオーナーウィンドウと対象のボタンを引数に取った方がいいと思う
・計算だけなら全部Rectangleでいいんじゃないの
Rectangle CalcPopupLocation(Rectangle Owner, Rectangle TargetButton, Rectangle Popup)
771デフォルトの名無しさん (アウアウウー Sa85-dxf9)
垢版 |
2019/09/24(火) 00:03:53.21ID:ftn8dtDua
>>769
だからさ、そのメソッドをどこに書くおつもり?

ポップアップを左右どちらに寄せるべきかを知ってるのは特定のFormだけのはずなのに
その例のllauncherの型がFormってのは変じゃないか?

そもそも何で「左右どちらに寄せるべきかを知ってる」奴のメソッドとして実装しないの?
それなら引数で渡す必要ないと思うんだけど。
772デフォルトの名無しさん (アウアウウー Sa85-dxf9)
垢版 |
2019/09/24(火) 00:09:30.85ID:ftn8dtDua
>>770
必要な情報は

(1) 左右どちらに揃えるか?(HorizontalAlignment)
(2) 揃える位置のx座標

だけだね
2019/09/24(火) 11:39:03.69ID:vbZsX/Wo0
書き込みは、人を憎んでコードを憎まずのこころで行いましょう。

たとえクソコードであっても悪いのは書いた人だけです。
コードやプログラミング言語に罪は一切ありません。
コードの悪口はやめましょう。
クソコードの修正と言わず、リファクタリングといえばいいのです。

大量殺人犯や c# プログラマーの醜い心はリファクタリング不可能ですが、コードのリファクタリングはカンタンですよ。

https://www.google.co.jp/amp/s/anond.hatelabo.jp/touch/20180319181104%3fmode=amp
2019/09/24(火) 12:11:17.28ID:yrtqWHxIM
性格の悪さもリファクタリングしてくれ
775デフォルトの名無しさん (エムゾネ FF22-9GzD)
垢版 |
2019/09/24(火) 14:58:01.43ID:oiN+60axF
性格はコードに滲み出るよ
2019/09/24(火) 23:29:02.86ID:OoYPx0Tk0
性格は分からないけど姿勢みたいなものは見えると思ってる
こんなコピペばかりして少しはおかしいと思わないのかな?とかこんな古い書き方して言語の文法ざっとでもいいから一通り見たのかな?とか
いいコードを書こうとしてる人とそうでない人の差ってすごくよく分かる。本当に能力無くて頑張って頑張ってるのにひどいって場合もきっとあるんだろうけど
777デフォルトの名無しさん (ワッチョイ 4690-jgJV)
垢版 |
2019/09/24(火) 23:44:57.44ID:3clb0+hp0
ようわからんけど動いてるからヨシ!
2019/09/25(水) 07:36:43.68ID:apbfD+2I0
式木がイケてるらしいですが使いどころが解りません
プロの皆さんはどこで使ってますか?
2019/09/25(水) 10:16:37.93ID:HV92OfVjM
>>778
使わない
高度なフレームワークを作るための機能であり、ドカタグラマには全く必要ないから忘れていいよ
2019/09/25(水) 22:57:19.53ID:5YRgoX3y0
>人を憎んでコードを憎まず

逆じゃないんかおい
2019/09/25(水) 23:01:24.46ID:1MbrNFaz0
自分より給料貰ってる先輩(笑)が
クソコードを産み落としていた場合は人もコードも憎む
というか蔑む
2019/09/25(水) 23:16:09.44ID:5YRgoX3y0
何をもってくそコードと言ってるのか
2019/09/25(水) 23:38:23.64ID:1MbrNFaz0
何を以ってクソコードかは難しいところだが具体例なら無数に挙げられるぞ

switchを使わず延々とif-else if分岐
if(flag) return ture; return false;
一行違うだけのメソッド大量生成
マジックナンバーだらけ
コレクションはほとんどList
かと思えば特にライブラリに必要とされているわけでもないobject[]
もちろんパターンマッチングなんて概念は存在しない
out代わりにrefを使う
boolではなくintをフラグとして使う
クラス内のあらゆる場所から明示されず書き換えられるフィールド
どう見ても親子関係にない継承
メソッド1個300行以上
これがさぞ大変な処理かと思えばリファクタリングしたら40行で書けた
1行に300文字以上
リソースでもFormsでもない普通のクラスが4000行
2019/09/25(水) 23:54:44.99ID:NtFNmlTfp
>>778
ドカタだけどlinqのwhereメソッドの引数を動的に生成するときに使った

ここ参考になるよ
https://www.atmarkit.co.jp/fdotnet/dotnettips/986dynamiclinq/dynamiclinq.html
2019/09/26(木) 00:03:29.50ID:68XB546j0
>>783
ぜんぜん許容範囲だな!
その程度でくそ呼ばわりされたらたまらん
2019/09/26(木) 00:08:48.21ID:QoSQSwcY0
>>783
>>switchを使わず延々とif-else if分岐
>>マジックナンバーだらけ
>>クラス内のあらゆる場所から明示されず書き換えられるフィールド
>>メソッド1個300行以上
>>リソースでもFormsでもない普通のクラスが4000行
今直面してるのにまさに当てはまっててもう

>>コレクションはほとんどList
こっちはListどころか配列しか使わないんだぜ。もう書き方が完全にC
2019/09/26(木) 00:09:16.61ID:NU/jFtK40
メソッド以外はどれも影響は大きくないし
多少大きくてもテストできればなんとかなる
ちょっとした文化の違い程度の話だ
2019/09/26(木) 00:10:34.86ID:NU/jFtK40
初心者が一見してくそ呼ばわりするコードはたぶんくそじゃない
わかるから細かい粗が目に付く

普遍的恐怖を知るべきだ



ぐちゃぐちゃな循環参照
テストできないメソッド

う そ っ ぱ ち の 名 前
2019/09/26(木) 00:15:27.94ID:ThQ6mTfg0
突然現れるlinqの長々としたクエリ式
せてめメソッド式にしてくれ
2019/09/26(木) 00:18:57.61ID:NU/jFtK40
しかしC#いつのまにやらパターンマッチまで入ってたんか…
2019/09/26(木) 00:28:52.23ID:ZFJdpCv/0
sqlを全て文字列結合で作ってるうえに500行以上あったときは後輩に丸投げした
2019/09/26(木) 03:16:32.66ID:wZcpOMsUd
>>780
バグやコードを憎んで、人を憎まず。

こんなこと言ってるプログラマーは意識高い系の偽善者のクズ。
2019/09/26(木) 11:30:46.50ID:Av/VHz3vp
あいつに任せた俺の責任だからって最初から頭数に入れていないから憎みもしない。必要なら全面書き直しもいとわない。
2019/09/26(木) 20:59:42.99ID:7bLC7yvk0
なんでListがいかんのか?
2019/09/26(木) 21:12:02.17ID:aLxxu1ok0
ビットで判定とるのがいかんのか?
2019/09/26(木) 21:18:55.30ID:fUfQlO4W0
7f63-aXvPからクソグラマーの臭いがする
2019/09/26(木) 21:21:22.68ID:fUfQlO4W0
>>794
時と場合を考えて最適なコレクションを検討しろ

>>795
特別な理由がないなら褒められないな
2019/09/26(木) 21:37:16.13ID:aLxxu1ok0
ZDDをboolの配列で評価するの?orz
2019/09/26(木) 21:40:05.70ID:fUfQlO4W0
>>798
特別な理由がないならと言ってるだろうが
2019/09/26(木) 22:03:13.49ID:QoSQSwcY0
windows formsの書き方についてなんですけど
メイン画面にタブがいっぱいあってそれを切り替えて……みたいなアプリなんです
んで中身見たらFormクラスが1万行オーバーで。画面一つだからって何もかも突っ込んでる感じなんです
画面というかフォーム一つで1クラスみたいなのが通常の書き方なんでしょうか
2019/09/26(木) 22:10:14.52ID:Av/VHz3vp
普通はブロックに分ける。
2019/09/26(木) 22:13:41.16ID:fJKX2zi80
>>800
タブ毎にユーザーコントロールを作ればスッキリはすると思うよ
2019/09/26(木) 22:23:35.32ID:lGqB6oAG0
>>800
「通常」はどうか知らないけど例えば
MDIアプリケーションを作成する
https://dobon.net/vb/dotnet/form/mdiapplication.html
こういう作り方もある
あと一つのフォームに普通のコードはともかくコントロール(InitializeComponentのなか)を多く詰め込みすぎると起動に時間がかかるようになる
現状で問題ないのならそこは気にすることは無いが
2019/09/26(木) 22:53:44.29ID:d7SzDWCz0
>>800
parcial class でタブごとにファイルわける。
2019/09/26(木) 23:38:48.19ID:QoSQSwcY0
なるほど参考になりました。
今思えば既にタブごとに部分クラスわけしてファイル別になってたような気がしないでもない……となると実質一クラス10万行か。笑えない
2019/09/27(金) 06:43:42.33ID:N2euUEC0M
>>800
1000行超える時点でオブジェクト指向できてない証拠
2019/09/27(金) 08:33:35.75ID:1dreLMG90
フォーム以外で使わない処理を
わざわざ外部のファイルやクラスに作る必要なんてある?
2019/09/27(金) 08:42:46.73ID:eAUqf5T9a
>>807
それで可読性が高まるならやる意味はある
2019/09/27(金) 09:06:13.84ID:ikgA/i06d
C#は1ファイルに全部書けるので必要ないです
2019/09/27(金) 10:07:45.04ID:NnPkuVhE0
再利用しないならそれでいいんじゃね?
2019/09/27(金) 22:47:27.06ID:uik+OEWH0
お前を含めた全人類が未来永劫そのコードに手を加えない保証があるなら好きにすればいい
2019/09/27(金) 23:28:58.48ID:MmWjZkvh0
ググったらタブ大量にあるような場合>>802がクラス分割のためのメジャーな手法なのね
2019/09/28(土) 08:43:54.27ID:uN9Z5b+x0
游ゴシックの英数文字をMeasureStringで取得した矩形を使ってDrawStringすると高さ不足で表示されない

矩形を使わなきゃ表示はできるから良いけどもやもやする
2019/09/28(土) 10:37:47.08ID:elJniuwU0
フォント周りおかしいのはMS伝統では
ないだろうか?

815デフォルトの名無しさん (アウアウウー Sa8b-dvEi)
垢版 |
2019/09/28(土) 14:09:54.66ID:51nJyp6ja
そんなざっくりした話じゃ、どうせお前自身のコードのバグだろって
反応しか返ってこないと思うw
2019/09/29(日) 01:52:26.51ID:sVRG+wNI0
インターフェイスと抽象クラスってどう使い分ければ良いのでしょう?

ググってもよくわかりません。
2019/09/29(日) 02:47:00.08ID:TNnn17Gh0
インターフェースなら継承関係のない複数のクラスのように
振る舞うことができる
2019/09/29(日) 02:49:22.44ID:HU0MDVmv0
大雑把言えば
プロパティとフィールド(値)を保持するのがクラス
クラスのメソッド(挙動)を公開するのがインターフェイス
2019/09/29(日) 02:54:07.57ID:TNnn17Gh0
それが抽象クラスとなにが違うのだ?と彼は聞いているわけで
2019/09/29(日) 03:01:23.20ID:HU0MDVmv0
インターフェイスは値を持たないし
原則として挙動の実装も持たせない
■ このスレッドは過去ログ倉庫に格納されています