有沒有區別: foo is null
和foo == null
?「foo is null」和「foo == null」有什麼區別
回答
從MSDN文檔:
Is operator 檢查如果一個對象是與給定類型兼容,或(開始用C#7)測試針對圖案的表達式。 is關鍵字在運行時評估類型兼容性。它確定對象實例或表達式的結果是否可以轉換爲指定的類型。
== is 對於預定義的值的類型,如果它的操作數的值相等,否則爲假相等運算符(==)返回true。對於字符串以外的引用類型,如果其兩個操作數引用同一對象,則==會返回true。對於字符串類型,==比較字符串的值。
摘要:不,在這個例子中沒有。如果您想檢查type
,通常會使用is
。在這種情況下它是空的。 ==
如果你想檢查價值。在這種情況下也是null,所以兩者都會評估爲true。
該文檔令人困惑。'=='可以被重載,因此,對於用戶定義的類型,它可以返回任何你想要的。 – svick
簡短版本:對於表現良好的類型,foo is null
和foo == null
之間沒有區別。
龍版本:
當你寫foo == null
和operator ==
適當超載存在,那麼這就是所謂。否則,引用相等用於引用類型,值相等用於值類型。
當您爲參考類型編寫foo is null
時,編譯時就像編寫了object.Equals(null, foo)
(注意切換順序,它有區別)。實際上,這在foo
和null
之間執行參考相等比較。對於值類型,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 == null
是true
非null
foo
。作爲此的副作用,在正常情況下,foo == null
和foo is null
將具有相同的值。
- 1. <foo></foo>和JAXB中的null有什麼區別?
- 2. using params [:foo]和@foo有什麼區別?
- 3. Foo :: class.java和Foo :: javaClass有什麼區別?
- 4. 在javascript中,`{foo:「bar」}`和`{「foo」:「bar」}`有什麼區別?
- 5. 在MySql中有什麼區別!= NULL和IS NOT NULL
- 6. 「x is null」和「x == null」有什麼區別?
- 7. foo-> bar和&foo-> bar有什麼區別?
- 8. 高速路由中`/:foo *`和`/:foo(。*)`有什麼區別?
- 9. Foo級有什麼區別; end&Foo = Class.new(和模塊/模塊)?
- 10. `raise「foo」`和`raise Exception.new(「foo」)``有什麼區別?
- 11. 在PHP中$ bar = boolval($ foo)和$ bar =(bool)$ foo有什麼區別?
- 12. Clojure中foo,:: foo,:: bar/foo和bar/foo之間的區別是什麼?
- 13. (null)和<null>有什麼區別?
- 14. != null和!== null之間有什麼區別?
- 15. `return $ this-> foo()=== null`是什麼意思?
- 16. 爲什麼var foo = null編譯
- 17. ifeq($(foo),)和ifndef foo之間的區別是什麼
- 18. 「virtual void IBase :: Foo」和「virtual void Foo」之間的區別是什麼?
- 19. 「#if Foo - 0 == 0」和「#if defined(Foo)&& Foo == 0」之間的區別是什麼?
- 20. javascript中的=='foo'和'foo'== a的區別
- 21. 絕對(「/ foo」)和相對(「../foo」)文件名。什麼是「foo」類別?
- 22. 「x IS NULL」和「NOT(x IS NOT NULL)」之間的區別是什麼?
- 23. func foo(arr [] int)int和func foo(arr [num] int)有什麼區別int
- 24. 當++運算符重載時,爲什麼++ foo和foo ++沒有區別?
- 25. 當sub Foo :: bar {}和sub bar {}屬於Foo包時,它們有什麼區別?
- 26. 作爲參數($ foo)和(foo $ foo)之間的區別
- 27. 類foo,類foo()和類foo(object)之間的區別?
- 28. 「struct foo *」和「foo *」之間的區別foo是一個struct嗎?
- 29. Shell腳本:「本地foo」和「本地foo =」有區別嗎?
- 30. 什麼是$ FOO的區別===真時真=== $ foo的
您是否建議只有在C#7中我們是否能夠找出引用是否爲空? –
@DavidArno你說得對,我已經改進了這個問題,所以現在很清楚。 – MaciejLisCK