C#:在健全性检查中减少线路噪音

时间:2011-06-21 21:55:31

标签: c# if-statement sanity-check

  

可能重复:
  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,进来)?

3 个答案:

答案 0 :(得分:2)

我通常只是将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;
}

答案 1 :(得分:2)

这是一个经常被请求的功能,因此现在在StackOverflow上已多次询问此问题。参见

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

对它的一些想法。

答案 2 :(得分:2)

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