我应该使用默认(Foo),Foo.Empty还是null?

时间:2008-10-09 19:39:25

标签: c# constructor conventions

所以C#现在允许你使用default(Foo)来获得一个认可的“未填充”/空类的实例 - 我不确定它是否与new Foo()完全相同或不。许多库类还实现了Foo.Empty属性,该属性返回类似的实例。当然,任何引用类型都可以指向null。那真的,有什么区别?什么时候是对还是错?什么更一致,或表现更好?在检查对象在概念上是否“未准备好黄金时间”时,我应该使用哪些测试?不是每个人都有Foo.IsNullOrEmpty()

3 个答案:

答案 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(), nullFoo.Empty()没有。这使得它成为与泛型类型一起使用的不错选择,例如,当您可能不知道您正在处理哪些类型时。但在大多数参考类型的情况下,null可能已经足够好了。

答案 2 :(得分:2)

当您知道所涉及的实际类型时,或者如果您有一个使用“:class”约束的类型参数,则最简单的方法是使用已知值(null,0等)。

当你得到一个不受约束或约束的类型参数而不是引用类型时,你需要使用默认值(T)。