2016-11-18 80 views
76

在C#7,我們可以使用的「x is null」和「x == null」有什麼區別?

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 /什麼新功能於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考慮了比較的其他站點上的類型。太棒了!

我覺得== nullis null不變模式就是東西是「意外」,很熟悉其中is運營商的語法和平等的運營商產生同樣的結果。


由於svick評論說:is null calls System.Object::Equals(object, object) where == calls 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,也因爲這only makes a difference on instances沒有區別。

+0

是的,這也是我對這個新功能的理解。我認爲這將主要用於'switch'結構,這在c#中有一點限制。但是,從「零」這個角度來看,我認爲它會以一種或另一種方式相同。 – Pikoh

+0

我想是的。我不知道對生成的CIL有什麼影響,但我想這沒有什麼區別。 –

+9

@PatrickHofman [看起來像'is'調用'object.Equals(x,null)',而'=='編譯爲'ceq'。](http://tryroslyn.azurewebsites.net/#b:master/ f:%3Eilr/K4Zwlgdg5gBAygTxAFwKYFsDcAoADsAIwBswBjGUogQxBBgGEYBvbGNmAge06JgFkAjAApOBAFapSyGAA8AlDAC8APlkwwdCMCJEcASC49 + AJhHjJ0 + UtUylimFp04AvkA ==)但結果應該與您所說的相同。 – svick

相關問題