なんでSizeやPointはEquals(Size)やEquals(Point)を実装してないんだろ
推奨してるはずなのに
推奨なんかしてたか?
値型だから。
レベル低すぎるな
165 :
デフォルトの名無しさん:2007/03/24(土) 14:43:08
>>164 系統だてて説明するの面倒だなあ。。
その辺のことは、例えばアスキーから出てるartonって人の書いたc#の入門書に
詳しく書いてあるから興味があったら読むといいと思う。
>>163 DateTime.Equals(DateTime)は実装されてるぞ。
比較のパターン
1.値型 比較演算子 値型
2.オブジェクト.メソッド(変数1, 変数2)
1の場合は値の比較なら問題なし
2の場合は指し示すポインタ・型などを比較する場合に用いる
構造体の場合は IEquatable<T> を実装することが推奨だしょ
結局
>>161と同じだけど,System.Drawingの構造体は実装してないみたいだな
なんでなんだろ
170 :
デフォルトの名無しさん:2007/03/24(土) 16:00:21
>>161 値型はまた別では。参照比較しても意味がないし。
なるほど。整理すると
値型は迷わず == を使った方がよい。
参照型は == が値の比較になってるか参照の比較になってるかは実装しだいだから用心深く使い分ける。
Stringなどわかり切ってるものは == でいい。
IDEで値型と参照型を色違いで区別してくれるくらいのサポートは欲しいの。
オブジェクト指向の場合は継承でis-aの関係なども
考慮して比較しないといけない場合もある
例:TextBox is Control
文字列の場合、case sensitiveじゃない比較したいときにはよく使うな>Equals()
>>173 ツールのオプション
ユーザーの種類(値の型)で型の色は変えられる。変数の方は無理っぽい。
それからなぜかこの項目でVBのソースの色は変わらなかった。
>>171 『プログラミング .NET Framework 第2版』「6.1.3 値型によるEqualsの実装」に詳しく書いてあるね。
値型でEqualsをオーバーライドしない場合は
System.ValueType.Equalsでオーバーライドされた実装が呼ばれるんだけど、
この実装ってのがリフレクション経由でフィールドを全部列挙して、
それぞれに対してEqualsを呼び出すというものだったりする。
比較のたびに毎回リフレクション使われるとパフォーマンス的に悲惨なので、
値型は可能ならEqualsをオーバーライドすべしといわれていると。
番組始まったけど、亀田のボクシング発生するまであと何分くらいかかるんだ。
>>177 単純な型だとリフレクション使わずバイナリで比較されるはずだが
>>180 System.ValueType.Equals見てみたけど確かにそうっぽいね。
てことはデフォのSystem.ValueType.Equals(object obj)の欠点は
内部でRuntimeTypeを生成するコストがかかることと
引数がobject型のせいで確実にboxingが発生することぐらいか。
まあそんなとこでボクシングしてたら値型使う意味が無くなるけどな
ひょっとしてどこでボクシングが発生してるか全部調査してコード書いてるの?
おおう!ボックス化と亀をかけてたのか。いまごろ気付いたwww
185 :
181:2007/03/24(土) 22:06:35
もうちょっと調べてみたけどRuntimeTypeは1回作ったら使い回しみたいね。
Equalsの回数に比例してRuntimeTypeのインスタンスが作られるわけじゃないと。
というわけでRuntimeType生成コストも気にしなくていいみたい。