3

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

4

3 回答 3

16

default(Foo)Foo当是类类型时将返回 null,当是Foo值类型(例如 int)时将返回零,并且Foo所有字段都初始化为其各自default()值的实例,其中Foo是结构。它被添加到语言中,以便泛型可以同时支持值和引用类型 - MSDN 上的更多信息

default(Foo)当您在SomeClass<T>or的上下文中测试 TMyMethod<T>并且您不知道 T 是值类型、类类型还是结构时使用。

否则,null 应该表示“未知”,而 empty 应该表示“我知道这是空的”。如果你真的需要一个空但非空的类实例,请使用 Foo.Empty 模式;例如,如果您需要将某些变量初始化为空字符串,则可以String.Empty作为替代方案。""

如果您知道您正在使用引用类型(类),则使用 null,不涉及泛型,并且您正在显式测试未初始化的引用。

于 2008-10-09T19:54:38.803 回答
2

default(Foo)适用于值类型和引用类型。 New Foo(), null并且Foo.Empty()不要。这使它成为与泛型类型一起使用的好选择,例如,当您可能不知道您正在处理的是哪个时。但在大多数引用类型的情况下,null可能就足够了。

于 2008-10-09T19:45:51.503 回答
2

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

当您刚刚获得一个不受约束或受约束而不是引用类型的类型参数时,您需要使用 default(T)。

于 2008-10-09T20:11:10.050 回答