在C#7,我們可以使用的「x is null」和「x == null」有什麼區別?
if (x is null) return;
代替
if (x == null) return;
是否有任何優勢,使用比舊的語法的新途徑(例如前)?
語義有什麼不同?
只是一個味道的問題?如果不是,何時使用這個或另一個。
在C#7,我們可以使用的「x is null」和「x == null」有什麼區別?
if (x is null) return;
代替
if (x == null) return;
是否有任何優勢,使用比舊的語法的新途徑(例如前)?
語義有什麼不同?
只是一個味道的問題?如果不是,何時使用這個或另一個。
對於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
與is 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沒有區別。
是的,這也是我對這個新功能的理解。我認爲這將主要用於'switch'結構,這在c#中有一點限制。但是,從「零」這個角度來看,我認爲它會以一種或另一種方式相同。 – Pikoh
我想是的。我不知道對生成的CIL有什麼影響,但我想這沒有什麼區別。 –
@PatrickHofman [看起來像'is'調用'object.Equals(x,null)',而'=='編譯爲'ceq'。](http://tryroslyn.azurewebsites.net/#b:master/ f:%3Eilr/K4Zwlgdg5gBAygTxAFwKYFsDcAoADsAIwBswBjGUogQxBBgGEYBvbGNmAge06JgFkAjAApOBAFapSyGAA8AlDAC8APlkwwdCMCJEcASC49 + AJhHjJ0 + UtUylimFp04AvkA ==)但結果應該與您所說的相同。 – svick
這就是我剛纔看到的鏈接,但它不會給你太多的信息,這就是爲什麼我猜測OP在問這個問題。頁面最重要的部分是此測試 是運算符 「is」運算符用於檢查對象的運行時類型是否與給定類型兼容。換句話說,我們使用「is」運算符來驗證對象的類型是我們所期望的。讓我們看看它的語法: –
@SimonPrice這是關於當前版本的C#:C#6.這個問題是關於C#7,它有[模式匹配](https://blogs.msdn.microsoft.com/dotnet/2016/08/24 /什麼新功能於CSHARP-7-0 /)。 –
@bigown你在尋找什麼樣的細節? –