2020年01月 / 12月≪ 12345678910111213141516171819202122232425262728293031≫02月

2008.07.03 (Thu)

[C#] 文字列の比較は Equalsメソッドではなく ==演算子で行う

文字列を比較する方法として、C#では Java などと同じく、
Equalsメソッドと、==演算子が利用できますが、
少なくともC#の環境では==演算子 を利用したほうがよいです。

Equalsのが早いし、Javaでは ==演算子で比較すべきでないことは周知の事実。
しかしC#の世界では==演算子で比較すべきなのです。

なぜよいのか?ということを証明するため、サンプルソースコードを掲載しておきます。

ソフトウェア開発にとって重要なことは「ささいな速度アップ」ではありません。
「可読性」「保守性」「拡張性」など「速度」よりも重要なものがあることを忘れずに!


▼参考サイト
C#系
C# では文字列の比較に Equals を使うな
[VS.NET2005][C#]文字列の比較について - Insider.NET
文字列比較のパフォーマンス
Java系
Java 入門 if 文 equals()
Javaの日々 String型オブジェクトの場合、equalsでの比較より、==の方がパフォーマンスが高い
関連記事

※コメントを頂けると大変うれしいです。コメントはお気軽にどうぞ^-^

テーマ : プログラミング ジャンル : コンピュータ

18:08  |  ソフトウェア開発/プログラム  |  Trackback(0)  |  Comment(6)  |  EDIT  |  Top↑

*Comment

■参考になりました。

はじめまして。
突然のコメント失礼します。

仕事でC#を使い始めたのですが、文字列の比較で、Equals()メソッドか==かで迷っていたのですが、こちらのサイトでのサンプル等を拝見し、==の方が良いと思えました。
他のサイトでも==の方が良いと言われてますし、確信を持てた気分です。
参考になりました。ありがとうございました。
なおみ |  2008.07.11(金) 10:52 |  URL |  【コメント編集】

■なおみさんへ

スィンです。コメントありがとうございます。
早速この記事が参考になったようで、大変うれしく思っています。
C#は洗練されていて楽しい言語だと思います。

また、C#言語をメインにして、いろいろとソフトウェア開発関連の情報をソースコードも交えて掲載していきますので、よろしくです^-^
スィン |  2008.07.12(土) 02:51 |  URL |  【コメント編集】

■今更ですいません、某所でも書いたのですが…

ArrayList lst = new ArrayList();
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年以上前のネタに反応してしまい申し訳ありません。
z |  2010.01.13(水) 21:25 |  URL |  【コメント編集】

■RE: 今更ですいません、某所でも書いたのですが…

> z さん

はじめまして、コメントありがとうございます。

書かれているように、今でしたら ジェネリックの List を利用しますね。
これは、型がはっきりしているからです。

ArrayList の要素は object 型ですが、
今回はobjectとして比較したいわけではないので、
上記3の評価式の場合、自分でしたら明示的に

(string)lst[0] == (string)lst[1]

という対応をすると思います。
頓珍漢な回答をしていたらすいません。><
スィン |  2010.01.13(水) 21:43 |  URL |  【コメント編集】

返信ありがとうございます。

おっしゃるとおりキャストすれば問題無いんですけどね。

論点にしたいのはキャストを忘れた場合、trueの可能性もあるしfalseの可能性もあるってところで。

たとえば、汎用的な文字はConstant.csとかに定義してあって、
用意されていない文字列は文字列を結合して作るなんて場合、
文字列的には問題無いのに、Constantから設定した場合は
trueで、それ以外はfalseてなって…でもブレイクして変数
をウォッチしたら間違いなく左辺も右辺も同じ文字列、
なのに結果はfalse…


これは「コンパイル時にエラーが解る」
って利点を補ってあまりある「不具合の原因」
になる気がしまして。

(いっそのこと最適化してくれなければfalse固定なのに←暴論)

でも、C#なら==が一般的ですよねぇ。
z |  2010.01.13(水) 23:48 |  URL |  【コメント編集】

■RE: z さん

> z さん

お疲れ様です、スィンです。

基本的に List の場合は object比較してるので、
true を返してしまうのが問題なんですよね。zさんがおっしゃるように。

うーん、この件に関しては実際どうすべきだ、と強くはいえませんが、
List自体が諸刃の剣なので、扱いには注意して、
値を評価するときはキャストすることをコーディング規約に記載してしまう
ぐらい強制するしかないかもしれません。

でも、C#では、==が一般的ですが、Equalsでもいいとおもいますよ。
最終的には保守性が高くなればいいわけですから、
同じコードを触る可能性があるチームで認識が取れていたらよいと思います。
スィン |  2010.01.17(日) 00:09 |  URL |  【コメント編集】

コメントを投稿する

URL
COMMENT
PASS  編集・削除するのに必要
SECRET  管理者だけにコメントを表示
 

*Trackback

この記事のトラックバックURL

この記事へのトラックバック

 | BLOGTOP |