检查:null 与 default()?

问题描述 投票:0回答:8

我想检查引用类型是否为空。 我看到两个选项(_settings 是引用类型 FooType):

if (_settings == default(FooType)) { ... }

if (_settings == null) { ... }

这两者的表现有何不同?

c# .net-3.5 null
8个回答
45
投票

没有什么区别。任何引用类型的默认值为

null

MSDN 的

default
关键字的 C# 参考页:https://msdn.microsoft.com/en-us/library/25tdedf5.aspx.


21
投票

现在我们不再需要将类型传递给默认值,默认是首选。

  • 它同样可读

  • 它可以用于值类型和引用类型

  • 它可以用于仿制药

    if (_settings == 默认) { ... }

另外,打电话后

obj = enumerable.FirstOrDefault();

之后测试默认值而不是 null 更有意义。否则它应该是 FirstOrNull,但 value 没有 null 值,但有默认值。


15
投票

没有区别,但第二个更具可读性。使用

default
的最佳位置是处理泛型时。常用代码是
return default(T);


6
投票

没什么不同,但我认为

if (_settings == null) { ... }

更清楚了。


3
投票

我的理解是它们没有不同。仅当您处理值类型时它才重要。


3
投票

我肯定会进行针对 null 的特定检查。因为如果

_settings
类的类型发生变化,您可能会遇到引用问题。至少需要更改代码来破坏打开/关闭策略。

if( _settings == null ) {...}

这个IMO更安全、更清洁。


2
投票

正如已经提到的,没有区别......但无论如何你可能想要使用

default(<type>)
来处理它不是引用类型的情况。通常这仅适用于泛型,但对于一般情况来说这是一个好习惯。


0
投票

default
也可以更好地与结构一起工作,即如果我改变

public class MyDto
{
    public int Id { get; set; }
}

public class MyDto
{
    public int? Id { get; set; }
}

然后

if (dto.Id == default)

将继续正常运行。

© www.soinside.com 2019 - 2024. All rights reserved.