C#とC++/CLIとVBと.NETとWindowsで戯れる
http://d.hatena.ne.jp/gallu/20081118/p1
です。
がるさんのページを見てください。
基本的にレビューでなぜここでこの行を書いたか?と言う質問をします。
もちろん
return a+b;
なんてところで聞きはしませんが、
if ( a.Equals(b) )
なんて絶対に聞きますよ。バグだし。stringでこんなことしてたら
投稿日時 : 2008年11月18日 13:59
>バグだし。 バグと判断した理由が書かれてないようですが,こういう断定は一人歩きするので有害だと思ってます.
>stringでこんなことしてたら んーまだよく分からないっす. stringならではの問題ということはCulture絡みの話ですか?
タイプセーフがらみで.Equalsを使わないとか、そのへんって共有出来ている認識ではないんですね・・・ そこが本文じゃないんだけどなーどうしよう^^;
Java の人が初めて C# を書いたときに起こりがちかも。
>タイプセーフがらみで.Equalsを使わないとか、そのへんって共有出来ている認識ではないんですね・・・ いや,「神は細部に宿る」って話なのに「ほにゃらら禁止」とかいうのは逆方向なんじゃないかと. ついでにその話,string 関係ないですし. 例えば以下のようなケースがあるわけで. var a = double.NaN; var b = double.NaN; Console.WriteLine(a == b); // False Console.WriteLine(a.Equals(b)); // True Console.WriteLine(a.CompareTo(b)); // 0 ソートとか Distinct のようなものを実装するときは,歴史的経緯で扱いにくい挙動を示す演算子を使うより,IEquatable<T>やIComparable<T>のセマンティクスに従った方がコードは書きやすいです.
訂正: string関係ない → string特有でもない
stringでのバグって結局何なんでしょう? stringでこう書くことって実際はまずないですが、 バグって言われると具体的に何がバグなのか気になります。
String.Equality 演算子 [この演算子は、Equals メソッドを使用して実装されます。]と書いてありますが? Object.Equals メソッド [Equals の既定の実装では、参照型については参照の等価、値の型についてはビットごとの等価をサポートします。]こちらと混同されるとまずいというのはわかります。
すみません。 a.Equals(b) がなぜだめなのかよくわかりませんでした。 string a = "Nanda"; string b = "Kanda"; if (a.Equals(b)) 私はこのように書きます。どこかで stringは==ではなくEqualsで判断 と書いてあるのを読んだので・・・。
ずいぶん前に菊池さんのBlogとかで話題になってましたね。 結局議論が膨らんだままでまとめはなかったような・・・ >共有出来ている認識 私もどんな共有なのか結論が聞きたいです。
上記の件、Google先生に c# string equals をキーに尋ねたら解答を得られました。 確か以前読んだ書籍には「速いから」 という理由で推奨されていました。 こんな副作用があったとは・・・。 ウロコ落ちました。
ググっても分からんので出来れば教えていただけると… って単に型違いの時に動きに注意がいるって話ですかね? 単にそういう話ならそれはそれでいいんですが、 バグである理由があるならそれを知りたいです。
失礼しました・・・。 string.Equals() メソッドにはオーバーロードがあり、 string 型同士を比較するものと、Object 型として 比較するものがある。Object 型同士の比較だと int 型のオブジェクトと string 型でのオブジェクト という違いがあるので false になってしまう。 ということだそうです。 string s = "1"; int i = 1; if (s.Equals(i)) // これfalse if (s.Equals(i.ToString())) // これtrue だそうです。 ちなみに・・・ if (s == i) // コンパイルエラー if (s == i.ToString()) // これtrue だそうです。
...わかんねーや。 「string.Equals は 引数に(string だけじゃなく)object も受理するから、 結局コンパイル時にエラーなしにどんなもんでも呑み込むんで危ないよね」 ちゅーことすか?
たぶん、そういうことかと・・・。 そもそもstringとintを比較するときは きちんと型をそろえなさいって話になりそうですが。 コンパイル通ったから大丈夫だぜ。はは~ん。 てなことにならないように、ということでは?
>if ( a.Equals(b) ) >なんて絶対に聞きますよ。バグだし 私を含め、これに賛同する方はまずいないと思います。 この言い回しには、神も周りへの配慮も宿っていません。 (私の考えはεπιστημηさんの指摘と同じなので割愛)
Equalsメソッドがバグなのではなく、 Equalsメソッドを使って業務のコードを書いていることがバグとおっしゃりたいのだと思いますよ。 タイプセーフじゃない方の記述方法であえて書く意味がないから。
私は業務でEqualsメソッド使ってますね。 数万回のループで以前実験したのですが、 ==より数秒早かったですね。 ※詳細な件数と秒数を忘れてしまったのですが・・・。 バグと言い切るには難しいかな?というのが 私個人の感想ですかね。
それもちょっと疑問… ほとんど差はないと思いますが… 少なくとも1万回で1秒みたいな差が出るはずはないと思います…
Powered by: Copyright © 中博俊