4

これらの2つの比較ステートメントの違いは何ですか?

var result = EqualityComparer<T>.Default.Equals(@this, null);
var result = @this == null;

明らかに、目的はオブジェクト'@this'がnullであるかどうかをテストすることです。

4

3 に答える 3

7

まあそれはの種類によって異なり@thisます。のオーバーロードがない場合==、2行目は直接参照比較を実行するだけですが、1行目はオーバーライドさ Equalsれたメソッドまたはの実装を呼び出しますIEquatable.Equals

賢明実装であれば、両方の比較で同じ結果が得られます。

于 2012-09-13T13:40:23.823 に答える
2

最初のステートメントは、オブジェクト間でEquals()メソッドを呼び出して、オブジェクトがオーバーライドされてクラスに実装されていると仮定して、オブジェクトの値が等しいかどうかを確認しますT。2番目のステートメントは、クラス==のように演算子がオーバーライドされていない限り、代わりに参照を比較します。String

于 2012-09-13T13:39:48.223 に答える
1

オペレーター==ReferenceEqualsオブジェクトの比較を要求するため、オブジェクトが同じメモリ位置を指していることを比較します。

Equals代わりに、は単なる仮想メソッドであるため、オーバーライドできるため、タイプごとに異なる動作をする可能性があります

たとえば、CLR stringEqualsの場合、が参照型であっても、参照ではなくaの内容を比較します。stringstring

于 2012-09-13T13:42:13.167 に答える