null チェックに関しては、この 2 つは常に同じ結果を返す必要があります。ReferenceEquals または == 演算子が使用されたかどうかに関係なく、null 以外の参照が null に等しい場合 (Null オブジェクト パターンを使用している場合でも)、それは非常に悪いことです。したがって、そのシナリオでは ==/!= を使用します。
== 演算子がオーバーロードされている場合は、ReferenceEquals を使用した方がわずかに高速になる可能性があります。オーバーロードされた == が最初に行うべきことは、2 つの変数が同じオブジェクトを指しているかどうかを確認することです。そのため、オーバーロードされた演算子の場合、コール スタックに余分なフレームが作成されます。ReferenceEquals を使用すると、それが実行される唯一のチェックであることも保証されます。
私は通常、他のほとんどすべてのシナリオで ==/!= も使用します。全体的な考え方は、オペレーターが「平等」を定義するということです。これは常に参照的であるとは限りません (実際、ほとんどの複合オブジェクトは構造的に同等かどうかを比較する必要があります。メンバーが等しい場合、それらは同等です)。理論的には、オブジェクトは、等価性、相対的な順序などについて、自分自身を別のオブジェクトと比較する最善の方法を知っています。オブジェクトが他のものと等しいかどうかをオブジェクトに伝えさせます。