2016-11-18 16 views
76

我々は古い構文よりも新しい方法(前者の例)を使用するすべての利点があります"x is null"と "x == null"の違いは何ですか? C#7で

if (x is null) return; 

代わり

if (x == null) return; 

を使用することができますか?

セマンティクスはどのような違いがありますか?

味の問題ですか?そうでない場合は、どちらを使用するかを選択します。

Reference

+1

それは私がちょうど見ていたリンクですが、それはあなたに多くの情報を与えるわけではないので、私はOPが質問していると思います。このページの最も重要な部分はこのテストです はオペレータ "is"演算子は、オブジェクトの実行時の型が特定の型と互換性があるかどうかをチェックするために使用されます。つまり、 "is"演算子を使用して、オブジェクトの型が期待どおりであることを検証します。その構文を見てみましょう: –

+1

@SimonPriceこれはC#の現在のバージョンについてです:C#6。この質問はC#7です。[パターンマッチング](https://blogs.msdn.microsoft.com/dotnet/2016)/08/24/whats-new-in-csharp-7-0 /)を参照してください。 –

+0

@bigownどのような詳細をお探しですか? –

答えて

69

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は、比較の他のサイトのタイプを考慮に入れます。それはクールだ!

私は、is nullの定数パターンに対して、is演算子と同じ演算子の構文が同じ結果をもたらす「偶然」に非常によく知られているものだと思います。


svickコメントis null calls System.Object::Equals(object, object) where == calls ceqisため

IL:

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について話しているので、このonly makes a difference on instances以来の違いはありません。

+0

です。これは私がこの新機能についても理解していることです。私はそれが主にスイッチの構造に役立つだろうと思っています。しかし、「null」という言葉が参考になると思いますが、どちらか一方を使用しても同じであると思います。 – Pikoh

+0

そうですね。私は、生成されたCILにどういう影響を及ぼすのか分かりませんが、違いはありません。 –

+9

@PatrickHofman ['is'は' object.Equals(x、null) 'を呼び出し、' == 'は' ceq'としてコンパイルします。](http://tryroslyn.azurewebsites.net/#b:master/ f:%3Eilr/K4Zwlgdg5gBAygTxAFwKYFsDcAoADsAIwBswBjGUogQxBBgGEYBvbGNmAge06JgFkAjAApOBAFapSyGAA8AlDAC8APlkwwdCMCJEcASC49 + AJhHjJ0 + UtUylimFp04AvkA ==)しかし、結果は同じであるはずです。 – svick

関連する問題