2008-10-09 66 views
3

所以C#現在允許你使用default(Foo)得到公認的「不填充尚未」一類的/空實例 - 我不知道這是否是完全一樣new Foo()與否。許多庫類還實現了一個Foo.Empty屬性,該屬性返回一個類似的實例。當然,任何參考類型都可以指向null。真的,有什麼不同?何時是對還是錯?什麼更一致,或表現更好?在檢查對象是否在概念上「未準備好迎接黃金時段」時,應該使用什麼測試?並非每個人都有Foo.IsNullOrEmpty()我應該使用默認(Foo),Foo.Empty還是null?

+0

什麼是Foo?每種類型都有不同的默認值! – azamsharp 2008-10-09 19:45:22

回答

16

default(Foo)將返回空值時Foo是一個類型,零其中Foo是值類型(如int),以及Foo與初始化爲各自default()值,其中Foo是一個結構的所有字段的實例。它被添加到語言使仿製藥可支持兩種值類型和引用類型 - 更多info at MSDN

使用default(Foo)當你在SomeClass<T>MyMethod<T>背景下測試T和你不知道T是否會值類型,類類型或結構。

否則,空應該是指「未知」,而空應該是指「我知道這是空的」。如果你真的需要一個空的 - 但非空的 - 你的類的實例,請使用Foo.Empty模式;例如String.Empty作爲""的替代方法,如果您需要將某些變量初始化爲空字符串。

如果你知道你在使用引用類型(類),沒有涉及泛型,並且你正在顯式測試未初始化的引用,那麼使用null。

2

default(Foo)同時適用於值類型和引用類型。 New Foo(), nullFoo.Empty()不。這對於使用泛型類型來說是一個很好的選擇,例如,當你不知道你在處理哪個類型時。但在大多數參考類型的情況下,null可能已經足夠好了。

2

當你知道涉及的實際類型,或者如果你有一個類型參數約束「:class」,使用已知值(null,0等)是最簡單的。

當你拿到一個類型參數是無約束或限制以外的其他引用類型,你需要使用默認(T)。

相關問題