我想要检查一个引用类型是否为null。我看到有两个选项(_settings是引用类型FooType):
if (_settings == default(FooType)) { ... }
与
if (_settings == null) { ... }
这两者有何不同表现?
没有区别。任何引用类型的默认值都是null
。
default
关键字的MSDN C#参考页面:https://msdn.microsoft.com/zh-cn/library/25tdedf5.aspx。
null
值有一种类型。这是真的吗? - Stephen Cleary现在我们不再需要将类型传递到默认值,因此优先使用default。
它与以前一样易读
它可用于值类型和引用类型
它可用于泛型
if (_settings == default) { ... }
此外,在调用之后
obj = enumerable.FirstOrDefault();
在这之后测试默认值更有意义,而不是测试 null 值。否则它应该被称为 FirstOrNull,但是 value 没有 null 值,但有默认值。
两者没有区别,但第二个更易读。在处理泛型时,使用default
的最佳场所是通用代码return default(T);
DateTime
,它返回的是 "0001-01-01T00:00:00",这是一个有效值...不像 null
是无效值。 - Yousha AleayoubDateTime
不属于引用类型。” - Andreydefault
(不带括号),因为我能直觉地知道我所使用的类型的默认值是什么。它可以表示null
、DateTime.Min或者是int
类型的0
。对于那些不会自动将默认值注册在脑中的人来说,这样做会更具可读性。例如,它还可以帮助你搜索所有被赋予默认值的值。而不是搜索null
、0
或者Decimal.Zero
,你只需要搜索default
、== default
,甚至是is default
。 - Saturn K不是不同,但我认为
if (_settings == null) { ... }
我的理解是它们并没有区别。只有在处理值类型时才会有所不同。
我肯定会选择对null值进行特定的检查。因为如果_settings
类的类型发生更改,您可能会遇到引用问题。至少需要更改代码以打破开放/关闭策略。
if( _settings == null ) {...}
如先前所述,default(<type>)
与 null
没有区别,但是您仍然可能想要使用 default(<type>)
来处理非引用类型的情况。通常这只在泛型中出现,但养成这种习惯对于一般情况来说也是有好处的。
default(T)
,更易读。 - baltermia