2008-10-09 45 views
3

所以C#现在允许你使用default(Foo)得到公认的“不填充尚未”一类的/空实例 - 我不知道这是否是完全一样new Foo()与否。许多库类还实现了一个Foo.Empty属性,该属性返回一个类似的实例。当然,任何参考类型都可以指向null。真的,有什么不同?何时是对还是错?什么更一致,或表现更好?在检查对象是否在概念上“未准备好迎接黄金时段”时,应该使用什么测试?并非每个人都有Foo.IsNullOrEmpty()我应该使用默认(Foo),Foo.Empty还是null?

+0

什么是Foo?每种类型都有不同的默认值! – azamsharp 2008-10-09 19:45:22

回答

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(), nullFoo.Empty()不。这对于使用泛型类型来说是一个很好的选择,例如,当你不知道你在处理哪个类型时。但在大多数参考类型的情况下,null可能已经足够好了。

2

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

当你拿到一个类型参数是无约束或限制以外的其他引用类型,你需要使用默认(T)。