我应该使用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().

我应该使用default(Foo),Foo.Empty还是null

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