【发布时间】: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