C♯, C#相談室 Part38

このエントリーをはてなブックマークに追加
161デフォルトの名無しさん
なんでSizeやPointはEquals(Size)やEquals(Point)を実装してないんだろ
推奨してるはずなのに
162デフォルトの名無しさん:2007/03/24(土) 14:31:37
推奨なんかしてたか?
163デフォルトの名無しさん:2007/03/24(土) 14:31:47
値型だから。
レベル低すぎるな
164デフォルトの名無しさん:2007/03/24(土) 14:38:00
>>159
例えば?
165デフォルトの名無しさん:2007/03/24(土) 14:43:08
>>164
系統だてて説明するの面倒だなあ。。

その辺のことは、例えばアスキーから出てるartonって人の書いたc#の入門書に
詳しく書いてあるから興味があったら読むといいと思う。
166デフォルトの名無しさん:2007/03/24(土) 14:43:15
>>163
DateTime.Equals(DateTime)は実装されてるぞ。
167デフォルトの名無しさん:2007/03/24(土) 14:49:36
比較のパターン
1.値型 比較演算子 値型
2.オブジェクト.メソッド(変数1, 変数2)
1の場合は値の比較なら問題なし
2の場合は指し示すポインタ・型などを比較する場合に用いる
168デフォルトの名無しさん:2007/03/24(土) 14:54:43
構造体の場合は IEquatable<T> を実装することが推奨だしょ
169デフォルトの名無しさん:2007/03/24(土) 15:05:21
結局>>161と同じだけど,System.Drawingの構造体は実装してないみたいだな
なんでなんだろ
170デフォルトの名無しさん:2007/03/24(土) 16:00:21
>>139
サンクス。
よくわかったよ。
171デフォルトの名無しさん:2007/03/24(土) 17:15:20
>>161
値型はまた別では。参照比較しても意味がないし。
172デフォルトの名無しさん:2007/03/24(土) 17:27:14
>>171
ボクシングが発生しないだろ
173デフォルトの名無しさん:2007/03/24(土) 18:00:06
なるほど。整理すると
値型は迷わず == を使った方がよい。
参照型は == が値の比較になってるか参照の比較になってるかは実装しだいだから用心深く使い分ける。
Stringなどわかり切ってるものは == でいい。

IDEで値型と参照型を色違いで区別してくれるくらいのサポートは欲しいの。
174デフォルトの名無しさん:2007/03/24(土) 18:21:09
オブジェクト指向の場合は継承でis-aの関係なども
考慮して比較しないといけない場合もある
例:TextBox is Control
175デフォルトの名無しさん:2007/03/24(土) 18:30:35
文字列の場合、case sensitiveじゃない比較したいときにはよく使うな>Equals()
176デフォルトの名無しさん:2007/03/24(土) 18:39:57
>>173
ツールのオプション
ユーザーの種類(値の型)で型の色は変えられる。変数の方は無理っぽい。
それからなぜかこの項目でVBのソースの色は変わらなかった。
177デフォルトの名無しさん:2007/03/24(土) 19:00:20
>>171
『プログラミング .NET Framework 第2版』「6.1.3 値型によるEqualsの実装」に詳しく書いてあるね。

値型でEqualsをオーバーライドしない場合は
System.ValueType.Equalsでオーバーライドされた実装が呼ばれるんだけど、
この実装ってのがリフレクション経由でフィールドを全部列挙して、
それぞれに対してEqualsを呼び出すというものだったりする。

比較のたびに毎回リフレクション使われるとパフォーマンス的に悲惨なので、
値型は可能ならEqualsをオーバーライドすべしといわれていると。
178デフォルトの名無しさん:2007/03/24(土) 19:02:31
番組始まったけど、亀田のボクシング発生するまであと何分くらいかかるんだ。
179デフォルトの名無しさん:2007/03/24(土) 19:29:08
>>178
オレはチャンネル変えた。
180デフォルトの名無しさん:2007/03/24(土) 21:14:17
>>177
単純な型だとリフレクション使わずバイナリで比較されるはずだが
181デフォルトの名無しさん:2007/03/24(土) 21:57:43
>>180
System.ValueType.Equals見てみたけど確かにそうっぽいね。

てことはデフォのSystem.ValueType.Equals(object obj)の欠点は
内部でRuntimeTypeを生成するコストがかかることと
引数がobject型のせいで確実にboxingが発生することぐらいか。
182デフォルトの名無しさん:2007/03/24(土) 22:03:15
まあそんなとこでボクシングしてたら値型使う意味が無くなるけどな
183デフォルトの名無しさん:2007/03/24(土) 22:04:17
ひょっとしてどこでボクシングが発生してるか全部調査してコード書いてるの?
184デフォルトの名無しさん:2007/03/24(土) 22:05:28
おおう!ボックス化と亀をかけてたのか。いまごろ気付いたwww
185181:2007/03/24(土) 22:06:35
もうちょっと調べてみたけどRuntimeTypeは1回作ったら使い回しみたいね。
Equalsの回数に比例してRuntimeTypeのインスタンスが作られるわけじゃないと。
というわけでRuntimeType生成コストも気にしなくていいみたい。