これらの2つの比較ステートメントの違いは何ですか?
var result = EqualityComparer<T>.Default.Equals(@this, null);
var result = @this == null;
明らかに、目的はオブジェクト'@this'がnullであるかどうかをテストすることです。
まあそれはの種類によって異なり@thisます。のオーバーロードがない場合==、2行目は直接参照比較を実行するだけですが、1行目はオーバーライドさ Equalsれたメソッドまたはの実装を呼び出しますIEquatable.Equals。
賢明な実装であれば、両方の比較で同じ結果が得られます。
最初のステートメントは、オブジェクト間でEquals()メソッドを呼び出して、オブジェクトがオーバーライドされてクラスに実装されていると仮定して、オブジェクトの値が等しいかどうかを確認しますT。2番目のステートメントは、クラス==のように演算子がオーバーライドされていない限り、代わりに参照を比較します。String
オペレーター==はReferenceEqualsオブジェクトの比較を要求するため、オブジェクトが同じメモリ位置を指していることを比較します。
Equals代わりに、は単なる仮想メソッドであるため、オーバーライドできるため、タイプごとに異なる動作をする可能性があります。
たとえば、CLR stringEqualsの場合、が参照型であっても、参照ではなくaの内容を比較します。stringstring