-6

重複の可能性: C#と .Equals()
の違い==

2 つの変数を比較するには、== または Equals メソッドを使用できます。例えば、

        string a = new string(new char[] {'a', 'b', 'c', 'd'});
        string b = new string(new char[] {'a', 'b', 'c', 'd'});

        Console.WriteLine (a==b);
        Console.WriteLine (a.Equals(b));

私の質問は、いつ == を使用する必要があり、いつ Equals を使用する必要があるのですか? 両者に違いはありますか?

4

3 に答える 3

7

== は演算子であり、オーバーロードされていない場合、クラスの「参照の等価性」(および構造体のフィールド単位の等価性) を意味しますが、オーバーロードすることができます。オーバーライドではなくオーバーロードであるため、ポリモーフィックではありません。

Equals は仮想メソッドです。これによりポリモーフィックになりますが、null インスタンスで呼び出さないように注意する必要があります。

経験則として:

  • 何かの型を知っていて、それが == オーバーロードを持っていることを知っている場合 (string、int、float などのほとんどのコア型には == の意味があります)、== を使用します。
  • タイプがわからない場合は、null の問題を回避できるため、Equals(a,b) をお勧めします。
  • 本当に同じインスタンス (参照の等価性) を確認したい場合は、ReferenceEquals(a,b) の使用を検討してください。これは、== がオーバーロードされ、Equals がオーバーライドされた場合でも機能するためです。
  • ジェネリックを使用する場合EqualityComparer<T>.Default.Equals(a,b)は、null の問題を回避し、Nullable-of-T をサポートし、IEquatable-of-T をサポートするものを検討してください。
于 2012-04-30T07:13:29.023 に答える
4

John Skeet によるこの投稿は、あなたの質問に答えます。

では、いつどの演算子を使用する必要がありますか? 私の経験則では、ほぼすべての参照型について、同一性を参照するのではなく等価性をテストする場合は Equals を使用します。例外は文字列の場合です。文字列を == で比較すると、非常に単純で読みやすくなりますが、比較を適切に機能させるには、演算子の両側が文字列型の式である必要があることを覚えておく必要があります。

値型の場合、コードを読みやすくするために通常は == を使用します。値型が Equals とは異なる動作をする == のオーバーロードを提供する場合、事態はややこしくなりますが、そのような型は最初から設計が非常に悪いと考えています。

[著者: ジョン・スキート]

http://blogs.msdn.com/b/csharpfaq/archive/2004/03/29/when-should-i-use-and-when-should-i-use-equals.aspx

于 2012-04-30T07:09:43.970 に答える
1

オブジェクト型で == を使用すると、System.Object.ReferenceEquals に解決されます。

Equals は単なる仮想メソッドであり、そのように動作するため、オーバーライドされたバージョンが使用されます (文字列型の場合、内容が比較されます)。

https://stackoverflow.com/a/814880/655293

于 2012-04-30T07:09:57.327 に答える