【问题标题】:check against: null vs default()?检查:null vs default()?
【发布时间】:2011-03-14 21:10:15
【问题描述】:

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

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

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

这两者的表现有何不同?

【问题讨论】:

    标签: c# .net-3.5 null


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我的理解是它们没有什么不同。只有在处理值类型时才重要。

      【讨论】:

        【解决方案3】:

        没有什么不同,但我认为

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

        更清晰。

        【讨论】:

          【解决方案4】:

          没有区别,但第二个更具可读性。使用default 的最佳位置是在处理泛型时。常用代码为return default(T);

          【讨论】:

          • 对于DateTime,它返回“0001-01-01T00:00:00”,这是一个有效值......不像null,这是一个无效值。
          • @YoushaAleayoub 问题询问引用类型,DateTime 不是引用类型。
          • 我认为这是见仁见智的问题。我到处使用default(不带括号),因为我本能地知道我使用的类型的默认值是什么。对于我的int,它可能意味着null 或DateTime.Min 或0。对于不会自动在脑海中注册默认值的人来说,这将更具可读性。例如,它还可以帮助您搜索分配了默认值的所有值。无需搜索null0Decimal.Zero,您只需搜索default== default 甚至is default
          • @SaturnK 这是个人喜好问题,我更喜欢显式值而不是默认关键字(python 的 zen:显式优于隐式)。引入了 default 关键字以与模板类型一起使用,因为当涉及到默认值时,您不能在其中有明确的值。
          【解决方案5】:

          我肯定会针对 null 进行特定检查。因为如果 _settings 类的类型发生变化,您可能会遇到参考问题。至少需要更改破坏打开/关闭策略的代码。

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

          这个 IMO 更安全、更清洁。

          【讨论】:

            【解决方案6】:

            如前所述,没有区别...但是您可能无论如何都想使用default(<type>) 来处理它不是引用类型的情况.通常这仅在泛型中,但在一般情况下形成一个好习惯。

            【讨论】:

              【解决方案7】:

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

              • 可读性强

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

              • 可以用在泛型中

                如果(_settings == 默认){ ... }

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-04-03
                • 2016-09-05
                • 2012-09-03
                • 2016-01-20
                • 2013-08-04
                • 1970-01-01
                • 2013-12-18
                • 1970-01-01
                相关资源
                最近更新 更多