所以C#現在允許你使用default(Foo)
得到公認的「不填充尚未」一類的/空實例 - 我不知道這是否是完全一樣new Foo()
與否。許多庫類還實現了一個Foo.Empty
屬性,該屬性返回一個類似的實例。當然,任何參考類型都可以指向null
。真的,有什麼不同?何時是對還是錯?什麼更一致,或表現更好?在檢查對象是否在概念上「未準備好迎接黃金時段」時,應該使用什麼測試?並非每個人都有Foo.IsNullOrEmpty()
。我應該使用默認(Foo),Foo.Empty還是null?
3
A
回答
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(), null
和Foo.Empty()
不。這對於使用泛型類型來說是一個很好的選擇,例如,當你不知道你在處理哪個類型時。但在大多數參考類型的情況下,null
可能已經足夠好了。
2
當你知道涉及的實際類型,或者如果你有一個類型參數約束「:class」,使用已知值(null,0等)是最簡單的。
當你拿到一個類型參數是無約束或限制以外的其他引用類型,你需要使用默認(T)。
相關問題
- 1. 我應該使用.find(「.foo .bar」)還是.children(「.foo」)。children(「.bar」)?
- 2. 應該使用`!var`還是`var == NULL`?
- 3. C#:一個枚舉的默認值應該是None還是Unknown?
- 4. 我應該使用public $ var還是應該使用__construct()?
- 5. 我應該使用PurePDF還是AlivePdf
- 6. 我應該使用ABPersonViewController還是ABUnknownPersonViewController
- 7. 我應該使用Series.replace還是Series.str.replace?
- 8. 我應該使用requestanimationframe還是setTimeout?
- 9. 我應該使用SASS還是SCSS?
- 10. 我應該使用Boost.GIL還是死了?
- 11. 我應該使用Flash還是Java?
- 12. 我應該使用partial還是show.html.erb?
- 13. 我應該使用TNSNAMES.ORA還是tnsnames.ora?
- 14. 我應該使用pygame.event.get()還是pygame.event.poll()?
- 15. 我應該使用BroadcastReceiver還是Service?
- 16. 我應該使用urandom還是openssl_random_pseudo_bytes?
- 17. 我應該使用SyncLock還是Interlocked?
- 18. 我應該使用Backbone.emulateHTTP還是php file_get_contents
- 19. 我應該使用rand()還是rand_s()?
- 20. 我應該使用XMLHttpRequest/JSON還是iFrame?
- 21. 我應該使用NSOperation還是NSRunLoop?
- 22. 我應該使用UUID還是其他?
- 23. 我應該使用UIImageview還是其他?
- 24. 我應該使用TempData還是RedirectToAction?
- 25. 我應該使用SPContext還是ClientContext?
- 26. 我應該使用Timer,Handler還是ASyncTask?
- 27. 我應該使用SQL還是JSON
- 28. 我應該使用KeyGenerator還是SecretKeyFactory?
- 29. 我應該使用AJAX還是WebSockets。
- 30. 我應該使用值還是鍵?
什麼是Foo?每種類型都有不同的默認值! – azamsharp 2008-10-09 19:45:22