2017-06-17 107 views

回答

4

從MSDN文檔:

Is operator 檢查如果一個對象是與給定類型兼容,或(開始用C#7)測試針對圖案的表達式。 is關鍵字在運行時評估類型兼容性。它確定對象實例或表達式的結果是否可以轉換爲指定的類型。

== is 對於預定義的值的類型,如果它的操作數的值相等,否則爲假相等運算符(==)返回true。對於字符串以外的引用類型,如果其兩個操作數引用同一對象,則==會返回true。對於字符串類型,==比較字符串的值。

摘要:不,在這個例子中沒有。如果您想檢查type,通常會使用is。在這種情況下它是空的。 ==如果你想檢查價值。在這種情況下也是null,所以兩者都會評估爲true。

+1

該文檔令人困惑。'=='可以被重載,因此,對於用戶定義的類型,它可以返回任何你想要的。 – svick

7

簡短版本:對於表現良好的類型,foo is nullfoo == null之間沒有區別。

龍版本:

當你寫foo == nulloperator ==適當超載存在,那麼這就是所謂。否則,引用相等用於引用類型,值相等用於值類型。

當您爲參考類型編寫foo is null時,編譯時就像編寫了object.Equals(null, foo)(注意切換順序,它有區別)。實際上,這在foonull之間執行參考相等比較。對於值類型,foo is null不能編譯。

這意味着,如果你寫一個類woth operator ==,指出的foo一些實例等null,然後foo == null會得出不同的結果比foo is null

一個例子顯示這樣的:

using System; 

public class Foo 
{ 
    public static void Main() 
    { 
     var foo = new Foo(); 
     Console.WriteLine(foo == null); 
     Console.WriteLine(foo is null); 
    } 

    public static bool operator ==(Foo foo1, Foo foo2) => true; 
    // operator != has to exist to appease the compiler 
    public static bool operator !=(Foo foo1, Foo foo2) => false; 
} 

此代碼輸出:

True 
False 

當重載operator ==,你應該讓以合理的方式,其中,除其他外,意味着你的行爲不應該說foo == nulltruenullfoo。作爲此的副作用,在正常情況下,foo == nullfoo is null將具有相同的值。

相關問題