中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

神は細部に宿る

http://d.hatena.ne.jp/gallu/20081118/p1

です。

がるさんのページを見てください。

基本的にレビューでなぜここでこの行を書いたか?と言う質問をします。

もちろん

return a+b;

なんてところで聞きはしませんが、

if ( a.Equals(b) )

なんて絶対に聞きますよ。バグだし。stringでこんなことしてたら

投稿日時 : 2008年11月18日 13:59

コメントを追加

# re: 神は細部に宿る 2008/11/18 15:45 NyaRuRu

>バグだし。

バグと判断した理由が書かれてないようですが,こういう断定は一人歩きするので有害だと思ってます.

# re: 神は細部に宿る 2008/11/18 16:33 NyaRuRu

>stringでこんなことしてたら

んーまだよく分からないっす.
stringならではの問題ということはCulture絡みの話ですか?

# re: 神は細部に宿る 2008/11/18 16:57 中 博俊

タイプセーフがらみで.Equalsを使わないとか、そのへんって共有出来ている認識ではないんですね・・・
そこが本文じゃないんだけどなーどうしよう^^;

# re: 神は細部に宿る 2008/11/18 17:11 みきぬ

Java の人が初めて C# を書いたときに起こりがちかも。

# re: 神は細部に宿る 2008/11/18 17:17 NyaRuRu

>タイプセーフがらみで.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>のセマンティクスに従った方がコードは書きやすいです.

# re: 神は細部に宿る 2008/11/18 17:23 NyaRuRu

訂正:
string関係ない → string特有でもない

# re: 神は細部に宿る 2008/11/18 18:18 なちゃ

stringでのバグって結局何なんでしょう?
stringでこう書くことって実際はまずないですが、
バグって言われると具体的に何がバグなのか気になります。

# re: 神は細部に宿る 2008/11/18 20:48 えムナウ

String.Equality 演算子
[この演算子は、Equals メソッドを使用して実装されます。]と書いてありますが?

Object.Equals メソッド
[Equals の既定の実装では、参照型については参照の等価、値の型についてはビットごとの等価をサポートします。]こちらと混同されるとまずいというのはわかります。

# re: 神は細部に宿る 2008/11/19 13:27 ちょ

すみません。
a.Equals(b)
がなぜだめなのかよくわかりませんでした。

string a = "Nanda";
string b = "Kanda";

if (a.Equals(b))

私はこのように書きます。どこかで
stringは==ではなくEqualsで判断
と書いてあるのを読んだので・・・。

# re: 神は細部に宿る 2008/11/19 13:32 通りすがり

ずいぶん前に菊池さんのBlogとかで話題になってましたね。
結局議論が膨らんだままでまとめはなかったような・・・
>共有出来ている認識
私もどんな共有なのか結論が聞きたいです。

# re: 神は細部に宿る 2008/11/19 13:34 ちょ

上記の件、Google先生に
c# string equals
をキーに尋ねたら解答を得られました。

確か以前読んだ書籍には「速いから」
という理由で推奨されていました。
こんな副作用があったとは・・・。

ウロコ落ちました。

# re: 神は細部に宿る 2008/11/19 16:05 なちゃ

ググっても分からんので出来れば教えていただけると…
って単に型違いの時に動きに注意がいるって話ですかね?

単にそういう話ならそれはそれでいいんですが、
バグである理由があるならそれを知りたいです。

# re: 神は細部に宿る 2008/11/20 8:29 ちょ

失礼しました・・・。

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

だそうです。

# re: 神は細部に宿る 2008/11/20 9:26 επιστημη

...わかんねーや。

「string.Equals は 引数に(string だけじゃなく)object も受理するから、
結局コンパイル時にエラーなしにどんなもんでも呑み込むんで危ないよね」

ちゅーことすか?

# re: 神は細部に宿る 2008/11/20 15:38 ちょ

たぶん、そういうことかと・・・。

そもそもstringとintを比較するときは
きちんと型をそろえなさいって話になりそうですが。

コンパイル通ったから大丈夫だぜ。はは~ん。

てなことにならないように、ということでは?

# 部外者から率直な意見を 2008/11/20 19:33 しばしば参考にさせて頂いております

>if ( a.Equals(b) )
>なんて絶対に聞きますよ。バグだし

私を含め、これに賛同する方はまずいないと思います。
この言い回しには、神も周りへの配慮も宿っていません。

(私の考えはεπιστημηさんの指摘と同じなので割愛)

# re: 神は細部に宿る 2008/11/21 11:44 よねけん

Equalsメソッドがバグなのではなく、
Equalsメソッドを使って業務のコードを書いていることがバグとおっしゃりたいのだと思いますよ。
タイプセーフじゃない方の記述方法であえて書く意味がないから。

# re: 神は細部に宿る 2008/11/26 13:18 ちょ

私は業務でEqualsメソッド使ってますね。
数万回のループで以前実験したのですが、
==より数秒早かったですね。
※詳細な件数と秒数を忘れてしまったのですが・・・。

バグと言い切るには難しいかな?というのが
私個人の感想ですかね。

# re: 神は細部に宿る 2008/11/27 0:05 なちゃ

それもちょっと疑問…
ほとんど差はないと思いますが…
少なくとも1万回で1秒みたいな差が出るはずはないと思います…

タイトル
名前
URL
コメント