- PR -

[VS.NET2005][C#]文字列の比較について

1
投票結果総投票数:38
Equals()を推奨 7 18.42%
==を推奨 30 78.95%
その他 1 2.63%
  • 投票は恣意的に行われます。統計的な調査と異なり、投票データの正確性や標本の代表性は保証されません。
  • 投票結果の正当性や公平性について、@ITは一切保証も関与もいたしません。
投稿者投稿内容
ベテラン
会議室デビュー日: 2005/05/16
投稿数: 85
お住まい・勤務地: 千葉県在住
投稿日時: 2006-12-26 14:05
皆さんこんにちは。
別件でEqualsについて調べていたときに「Equals を使うな。使う事を推奨するな。」と書かれたブログを見つけました。

ここで、ちょっと疑問が。
私はC#を勉強するに当たり、河端善博氏の「C#コーディング標準」を参考にしてました。

この中で「オブジェクトの同値比較」はEquals()メソッドの使用を推奨しています。
理由として・・・
1.もし実装者が Equals()を用意しているなら、それを使ってほしくて実装したはず。
2.String の比較では Option Compare Text に設定されていると大文字/小文字が区別されない。
とあります。

「オブジェクトの同値比較」と「文字列の比較」とは、若干考え方が違うかもしれませんが、上記2.の理由を考えると、==よりもEquals()を使用した方が良いように思えます。

皆さんは、「文字列の比較」に==とEquals()、どちらを使用してますか?
今後の参考にしたいので、できましたら理由なども教えて頂けると助かります。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-26 14:11
引用:

梶さんの書き込み (2006-12-26 14:05) より:

2.String の比較では Option Compare Text に設定されていると大文字/小文字が区別されない。

上記2.の理由を考えると、==よりもEquals()を使用した方が良いように思えます。


String::Compare メソッドの ignoreCase で明示化するのが好きです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
未記入
ベテラン
会議室デビュー日: 2003/06/26
投稿数: 76
投稿日時: 2006-12-26 16:00


[ メッセージ編集済み 編集者: 未記入 編集日時 2007-01-19 19:47 ]
うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-12-26 16:13
まず最初に
C#では、==演算子は内部でEqualsメソッドを使用しているため、
Equalsメソッドと==演算子は同じ結果を返します。

また、規約についてですが、私自身は推奨理由になっていないと思っています。
1.についてはまったく考慮する必要はなく、
そもそも、実装者の思いに応える為に手段を選ぶべきではありません。
もし、Equalsメソッド実装者の思いを汲んだとして、
==(op_equality)実装者の思いはいつ誰が汲むのでしょう?

2.についても同様で、
Option Compare Binaryを設定しているのに大文字/小文字が区別されないのなら問題ですが、
意図的に区別していないのであれば、何ら問題ないと思います。
その為に Option Compareステートメントがあるのではないでしょうか?
(それ以前に、C#にはOption Compareステートメントはありませんが。。。)

この規約については以前読んだことがありますが、
理由が理由として成り立っていない部分が多いため参考にはしていません。
(newやnull代入の説明とか間違ってますし。。。)


私は可読性の観点から==演算子を使用しています。
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2006-12-26 18:25
本来は、==演算子による比較は参照の比較、Equalsメソッドによる比較は値の比較ですね。
少なくとも、自分でエンティティクラスを作成するときは、これに準拠する (もしくはEqualsメソッドをオーバーライドしない) 必要があります。(これが一般的であるため、それに従わなければ使用者の混乱を招きます。)
Stringクラスは特殊なのでこれに準拠していません。(どちらも値の比較)

Stringクラスの比較に関する私の意見としては、本来は参照の比較を行う==演算子を使うよりはEqualsメソッドの方が適切だとは思います。
でも、そんなにこだわる必要もないような気がします。(つまり、気にすんな!ってことで)
ベテラン
会議室デビュー日: 2005/05/16
投稿数: 85
お住まい・勤務地: 千葉県在住
投稿日時: 2006-12-28 14:27
じゃんぬねっとさん、ぜうすさん、うにくまさん、よこけんさん。
貴重なご意見、有難う御座います。
引用:

うにくまさんの書き込み (2006-12-26 16:13) より:
意図的に区別していないのであれば、何ら問題ないと思います。
その為に Option Compareステートメントがあるのではないでしょうか?
(それ以前に、C#にはOption Compareステートメントはありませんが。。。)


C#にOption Compareステートメントが無かったのは知りませんでした(汗
今まで存在を気にかけた事が無かった位ですから、考慮に入れるまでもなかったかもしれませんね・・・

こちらに投稿させて頂いた後に、ネットでEquals()についてもう少し検索してみたところ、こちらの掲示板でも書き込んでいらっしゃる囚人さんのHPに辿り着きました。
http://blogs.wankuma.com/shuujin/archive/2006/02/03/21014.aspx

こうして見てみると
Equals()よりも==演算子を使うほうが間違いが無い!!
という気になってきました。
社内では私と同じで、皆Equals()推奨派なので、一度みんなで話し合ってみようと思います。

皆さん、どうも有り難う御座いました。
1

スキルアップ/キャリアアップ(JOB@IT)