因此,C# 现在允许您用于default(Foo)
获取已识别的“尚未填充”/空的类实例——我不确定它是否完全相同new Foo()
。许多库类还实现了一个Foo.Empty
属性,该属性返回一个类似的实例。当然,任何引用类型都可以指向null
. 所以真的,有什么区别?什么时候是对还是错?什么更一致,或者表现更好?在检查一个对象在概念上是否“尚未准备好迎接黄金时段”时,我应该使用哪些测试?不是每个人都有Foo.IsNullOrEmpty()
。
3 回答
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,不涉及泛型,并且您正在显式测试未初始化的引用。
default(Foo)
适用于值类型和引用类型。 New Foo(), null
并且Foo.Empty()
不要。这使它成为与泛型类型一起使用的好选择,例如,当您可能不知道您正在处理的是哪个时。但在大多数引用类型的情况下,null
可能就足够了。
当您知道所涉及的实际类型时,或者如果您有一个类型参数受“:类”约束,使用已知值(null、0 等)是最简单的。
当您刚刚获得一个不受约束或受约束而不是引用类型的类型参数时,您需要使用 default(T)。