我应该使用default(Foo),Foo.Empty还是null
本文关键字:Foo Empty 还是 null 我应该 default | 更新日期: 2023-09-27 17:48:52
所以 C# 现在允许您使用 default(Foo)
来获取一个可识别的"尚未填充"/类的空实例 - 我不确定它是否与new Foo()
完全相同。 许多库类还实现一个 Foo.Empty
属性,该属性返回一个类似的实例。 当然,任何引用类型都可以指向 null
. 所以真的,有什么区别? 什么时候是对还是错? 什么更一致,或表现更好? 在检查对象在概念上是否"尚未准备好进入黄金时间"时,我应该使用哪些测试? 不是每个人都有Foo.IsNullOrEmpty()
.
Foo
是类类型时,default(Foo)
将返回null,当Foo
是值类型(例如int(时返回零,以及所有字段初始化为各自default()
值的Foo
实例,其中Foo
是结构。它已添加到语言中,以便泛型可以同时支持值和引用类型 - MSDN 中的详细信息
当您在 SomeClass<T>
或 MyMethod<T>
的上下文中测试 T 并且不知道 T 是值类型、类类型还是结构时,请使用 default(Foo)
。
否则,null 应该表示"未知",而 empty 应该表示"我知道这是空的"。如果您确实需要类的空(但非空(实例,请使用 Foo.Empty 模式;例如 String.Empty
作为""
的替代方法,如果您需要将某个变量初始化为空字符串。
如果您知道正在使用引用类型(类(,不涉及泛型,并且您正在显式测试未初始化的引用,请使用 null。
当您知道所涉及的实际类型时,或者如果您有一个受": class"约束的类型参数,最简单的方法是使用已知值(null、0 等(。
当你只有一个不受约束或约束的类型参数而不是引用类型时,你需要使用 default(T(。
default(Foo)
适用于值类型和引用类型。 New Foo(), null
和Foo.Empty()
没有。 这使得它成为与泛型类型一起使用的不错选择,例如,当您可能不知道正在处理哪个泛型类型时。 但在大多数引用类型的情况下,null
可能就足够了。