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