これらの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 string
Equalsの場合、が参照型であっても、参照ではなくaの内容を比較します。string
string