C# 7では、
if (x is null) return;
の代わりに
if (x == null) return;
新しい方法 (以前の例) を古い方法よりも使用することで何か利点がありますか?
意味は異なりますか?
それは単に好みの問題ですか? そうでない場合、どちらを使うべきでしょうか?
参照:C# 7.0 の新機能。
ベストアンサー1
更新: Roslynコンパイラは、オーバーロードされた等価演算子がない場合、 2つの演算子の動作が同じになるように更新されました。現在のコンパイラの結果のコード(M1
そしてM2
コードでは)オーバーロードされた等価比較器がない場合に何が起こるかを示しています。どちらもよりパフォーマンスの高い==
動作をします。オーバーロードされた等価比較器がある場合、コードはまだ異なる。
Roslyn コンパイラの古いバージョンについては、以下の分析を参照してください。
null
C# 6 で慣れているものと違いはありません。ただし、別の定数に変更すると、興味深いことが起こりますnull
。
たとえば次のようになります:
Test(1);
public void Test(object o)
{
if (o is 1) Console.WriteLine("a");
else Console.WriteLine("b");
}
このテストでは が生成されますa
。これを通常記述したものと比較するとo == (object)1
、大きな違いがあります。 はis
比較の反対側の型を考慮に入れています。これはすばらしいですね。
== null
vs.定数パターンは、演算子と等号演算子is null
の構文が同じ結果を生成するという点で、「偶然」非常によく知られているものだと思います。is
としてスヴィックコメントした、is null
通話System.Object::Equals(object, object)
場所==
ceq
。
IL のis
:
IL_0000: ldarg.1 // Load argument 1 onto the stack
IL_0001: ldnull // Push a null reference on the stack
IL_0002: call bool [mscorlib]System.Object::Equals(object, object) // Call method indicated on the stack with arguments
IL_0007: ret // Return from method, possibly with a value
IL の==
:
IL_0000: ldarg.1 // Load argument 1 onto the stack
IL_0001: ldnull // Push a null reference on the stack
IL_0002: ceq // Push 1 (of type int32) if value1 equals value2, else push 0
IL_0004: ret // Return from method, possibly with a value
について話しているのでnull
、これに関しては違いはありませんインスタンスによってのみ違いが生じる等価演算子をオーバーロードすると、これが変わる可能性があります。