2008.07.03 (Thu)
[C#] 文字列の比較は Equalsメソッドではなく ==演算子で行う
Equalsメソッドと、==演算子が利用できますが、
少なくともC#の環境では==演算子 を利用したほうがよいです。
Equalsのが早いし、Javaでは ==演算子で比較すべきでないことは周知の事実。
しかしC#の世界では==演算子で比較すべきなのです。
なぜよいのか?ということを証明するため、サンプルソースコードを掲載しておきます。
ソフトウェア開発にとって重要なことは「ささいな速度アップ」ではありません。
「可読性」「保守性」「拡張性」など「速度」よりも重要なものがあることを忘れずに!
▼参考サイト
C#系
C# では文字列の比較に Equals を使うな
[VS.NET2005][C#]文字列の比較について - Insider.NET
文字列比較のパフォーマンス
Java系
Java 入門 if 文 equals()
Javaの日々 String型オブジェクトの場合、equalsでの比較より、==の方がパフォーマンスが高い
- 関連記事
- [C#] パフォーマンス測定クラスを拡張しました (07/06)
- [C#] 空文字の定義は String.Empty を使うべき?それとも "" ですか? (07/05)
- [C#] 文字列の比較は Equalsメソッドではなく ==演算子で行う (07/03)
- sinPocketStopWatch 3.11 リリースしました (04/15)
- sinPocketStopWatch 3.10 リリースしました (04/14)
※コメントを頂けると大変うれしいです。コメントはお気軽にどうぞ^-^
早速この記事が参考になったようで、大変うれしく思っています。
C#は洗練されていて楽しい言語だと思います。
また、C#言語をメインにして、いろいろとソフトウェア開発関連の情報をソースコードも交えて掲載していきますので、よろしくです^-^
string s1 = "文字";
string s2 = "文字";
//下2行をコメントにすれば以下は全部true(最適化のおかげ)
s1 = s1 + "列";
s2 = s2 + "列";
lst.Add(s1);
lst.Add(s2);
Console.WriteLine(s1 == s2);//1
Console.WriteLine(s1.Equals(s2));//2
Console.WriteLine(lst[0] == lst[1]);//3
Console.WriteLine(lst[0].Equals(lst[1]));//4
のような場合はどう考えてます?
自分は==派ですが、上を考えると何とも言えないんです。
等価演算子がstaticなんで実態がstringでも見た目object型になってるとobjectの==になってしまうし…
とくに、最適化のせい(おかげ)で、trueになったりfalseになったりするあたり、新人などはパニックになる気もしないでもないです。
.net1.1の頃の話なんで、今ならジェネリックなリスト使えば…って思いますが、場合によってはobjectを指定したジェネリックにせざるを得ないこともありますし…
1年以上前のネタに反応してしまい申し訳ありません。
はじめまして、コメントありがとうございます。
書かれているように、今でしたら ジェネリックの List を利用しますね。
これは、型がはっきりしているからです。
ArrayList の要素は object 型ですが、
今回はobjectとして比較したいわけではないので、
上記3の評価式の場合、自分でしたら明示的に
(string)lst[0] == (string)lst[1]
という対応をすると思います。
頓珍漢な回答をしていたらすいません。><
おっしゃるとおりキャストすれば問題無いんですけどね。
論点にしたいのはキャストを忘れた場合、trueの可能性もあるしfalseの可能性もあるってところで。
たとえば、汎用的な文字はConstant.csとかに定義してあって、
用意されていない文字列は文字列を結合して作るなんて場合、
文字列的には問題無いのに、Constantから設定した場合は
trueで、それ以外はfalseてなって…でもブレイクして変数
をウォッチしたら間違いなく左辺も右辺も同じ文字列、
なのに結果はfalse…
これは「コンパイル時にエラーが解る」
って利点を補ってあまりある「不具合の原因」
になる気がしまして。
(いっそのこと最適化してくれなければfalse固定なのに←暴論)
でも、C#なら==が一般的ですよねぇ。
お疲れ様です、スィンです。
基本的に List の場合は object比較してるので、
true を返してしまうのが問題なんですよね。zさんがおっしゃるように。
うーん、この件に関しては実際どうすべきだ、と強くはいえませんが、
List自体が諸刃の剣なので、扱いには注意して、
値を評価するときはキャストすることをコーディング規約に記載してしまう
ぐらい強制するしかないかもしれません。
でも、C#では、==が一般的ですが、Equalsでもいいとおもいますよ。
最終的には保守性が高くなればいいわけですから、
同じコードを触る可能性があるチームで認識が取れていたらよいと思います。
この記事のトラックバックURL
この記事へのトラックバック
突然のコメント失礼します。
仕事でC#を使い始めたのですが、文字列の比較で、Equals()メソッドか==かで迷っていたのですが、こちらのサイトでのサンプル等を拝見し、==の方が良いと思えました。
他のサイトでも==の方が良いと言われてますし、確信を持てた気分です。
参考になりました。ありがとうございました。