3

可能重复:
“如果对象为空,则为空,如果对象不为空,则为 object.member”的快捷方式

我希望有一种方法可以在 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,进来)?

4

3 回答 3

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;
}
于 2011-06-21T21:59:31.230 回答
2

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

“如果对象为空,则为空,如果对象不为空,则为 object.member”的快捷方式

关于它的一些想法。

于 2011-06-21T22:42:14.733 回答
2

好问题,但意图不好。您的代码将忽略得墨忒耳定律

于 2011-06-21T23:13:24.813 回答