所以C#现在允许你使用default(Foo)
来获得一个认可的“未填充”/空类的实例 - 我不确定它是否与new Foo()
完全相同或不。许多库类还实现了Foo.Empty
属性,该属性返回类似的实例。当然,任何引用类型都可以指向null
。那真的,有什么区别?什么时候是对还是错?什么更一致,或表现更好?在检查对象在概念上是否“未准备好黄金时间”时,我应该使用哪些测试?不是每个人都有Foo.IsNullOrEmpty()
。
答案 0 :(得分:16)
default(Foo)
是类类型时, Foo
将返回null,其中Foo
是值类型(例如int),并且Foo
的实例全部为{字段初始化为其各自的default()
值,其中Foo
是结构。它被添加到语言中,以便泛型可以支持值和引用类型 - 更多info at MSDN
在default(Foo)
或SomeClass<T>
的上下文中测试T时使用MyMethod<T>
并且您不知道T是值类型,类类型还是结构
否则,null应表示“未知”,而空应表示“我知道这是空的”。如果你真的需要一个空的 - 但是非null - 你的类的实例,请使用Foo.Empty模式;例如如果您需要将某个变量初始化为空字符串,请String.Empty
替换""
。
如果您知道自己正在使用引用类型(类),则使用null,不涉及泛型,并且您明确测试未初始化的引用。
答案 1 :(得分:2)
default(Foo)
适用于值类型和引用类型。 New Foo(), null
和Foo.Empty()
没有。这使得它成为与泛型类型一起使用的不错选择,例如,当您可能不知道您正在处理哪些类型时。但在大多数参考类型的情况下,null
可能已经足够好了。
答案 2 :(得分:2)
当您知道所涉及的实际类型时,或者如果您有一个使用“:class”约束的类型参数,则最简单的方法是使用已知值(null,0等)。
当你得到一个不受约束或约束的类型参数而不是引用类型时,你需要使用默认值(T)。