【问题标题】:C#: reducing line noise in sanity checks [duplicate]C#:减少健全性检查中的线路噪音[重复]
【发布时间】:2011-06-21 21:55:30
【问题描述】:

可能重复:
Shortcut for “null if object is null, or object.member if object is not null”

我希望有一种方法可以在 C# 中简化这种类型的测试:

if (foo != null &&
    foo.bar != null &&
    foo.bar.baz != null &&
    foo.bar.baz.bat != null)
{
    var bat = foo.bar.baz.bat;
    bat.cat = 5;
    bat.dog = 6;
}

支持这一点的一个可能特性是支持新变量声明的 if 语句,例如

if (foo != null &&
    (var bar = foo.bar) != null &&
    (var baz = bar.baz) != null &&
    (var bat = baz.bat) != null)
{
    bat.cat = 5;
    bat.dog = 6;
}

此处的收益可能并不明显,因为在此示例中建议的解决方案实际上更长。但如果名字更长,它真的会得到回报。

有没有更好的方法来做到这一点?像这样的建议是否有可能真正成为该语言的未来版本(请 Eric Lippert,进来)?

【问题讨论】:

  • 现在可能是重新审视您的设计的好时机,您必须通过这样的点运算符深入四层。必须同时完成很多间接级别。
  • 您的问题是什么? StackOverflow 不是 .NET 功能愿望清单。使用 connect.microsoft.com 站点直接向 Microsoft 请求功能。
  • 好吧,您可以尝试将其包装起来并捕获 NullReferenceException,但我怀疑这比手动运行 null 检查要慢得多。
  • 不会写所有var bar = ... 使用更多空间来复制这些对象,然后检查是否为空。似乎比第一种方法效率低。第二个看起来更好,我并没有真正卖掉。
  • @Prescott - 不会有任何复制,除非嵌套对象是值类型。在这种情况下,建议的解决方案实际上可能更有效,而不是更低,尽管这可能取决于编译器。

标签: c# if-statement sanity-check


【解决方案1】:

这是一个经常被要求的功能,因此这个问题现在已经在 StackOverflow 上被问过好几次了。见

Shortcut for "null if object is null, or object.member if object is not null"

关于它的一些想法。

【讨论】:

  • 太棒了,来自 Eric 的回复。谢谢。
【解决方案2】:

好问题,但意图不好。您的代码将忽略 Law of Demeter

【讨论】:

    【解决方案3】:

    我通常只是将 if 语句中的表达式移动到文件底部的自己的方法中:

    if (CheckBat(foo))
    {
        var bat = foo.bar.baz.bat;
        bat.cat = 5;
        bat.dog = 6;
    }
    
    ... snip ...
    
    private bool CheckBat(MyFoo foo)
    {
        return foo != null &&
               foo.bar != null &&
               foo.bar.baz != null &&
               foo.bar.baz.bat != null;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-02
      • 2011-06-10
      • 2011-01-12
      • 1970-01-01
      • 2021-03-27
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多