嵌套空值检查C#的简写
据我所知,没有一个更优雅的方式来写下面的….
string src; if((ParentContent!= null) &&(ParentContent.Image("thumbnail") != null) &&(ParentContent.Image("thumbnail").Property("src") != null)) src = ParentContent.Image("thumbnail").Property("src").Value
你认为应该有一个C#语言function来缩短它吗?
如果是这样,它应该是什么样的?
例如,像扩展?? 操作者
string src = ParentContent??.Image("thumbnail")??.Property("src")??.Value;
为相当人为的例子和我过度简化的解决方案道歉。
编辑……许多年后
现在这是一个名为“ Null传播运算符 ”的计划语言function?.
https://roslyn.codeplex.com/discussions/540883 (谢谢@Brian)
这样做没有内置语法,但您可以定义扩展方法来执行此操作:
R NotNull(this T src, Func f) where T : class where R : class { return src != null ? f(src) : null; }
现在,您可以按如下方式重写示例:
src = ParentContent.NotNull(p => p.Image("thumbnail")). NotNull(i => i.Property("src")).NotNull(src => src.Value);
它不像语法支持那么好,但我会说它更具可读性。
请注意,这会将NotNull
方法添加到所有.NET类型,这可能有点不方便。 您可以通过定义一个简单的包装类型WrapNull
来解决这个问题, WrapNull
只包含类型T
的值,以及一种将任何引用类型转换为WrapNull
并在WrapNull
类型中提供NotNull
的WrapNull
。 然后代码看起来像这样:
src = WrapNull.Wrap(ParentContent).NotNull(p => p.Image("thumbnail")). NotNull(i => i.Property("src")).NotNull(src => src.Value);
(因此,您不会使用新的扩展方法污染每种类型的IntelliSense)
通过更多的努力,您还可以定义LINQ查询运算符来执行此操作。 这有点矫枉过正,但有可能写出来(我不会在这里包含定义,因为它们有点长,但有可能有人感兴趣:-))。
src = from p in WrapNull.Wrap(ParentContent) from i in p.Image("thumbnail"). from src in i.Property("src") select src.Value;
它被建议并且显然被团队拒绝:
对于null,更多C#语法糖
建议的语法看起来像a.?b.?c()
– 非常有用,而且毫不含糊。
我真的很想看到它,但看起来不会发生。 也许如果有足够的人投票呢!
我们考虑过C#4,但没有预算。 这是很多人要求的一个很好的function,所以也许我们会把它变成一个未来的假设语言版本。 没有承诺。
纠正我,如果我错了,但这可以使用C#6.0的空条件运算符来解决:
string src = ParentContent?.Image("thumbnail")?.Property("src")?.Value;
如果在此值赋值之前已经使用了src
则可以按如下方式使用它:
string src = ....; // ... src = ParentContent?.Image("thumbnail")?.Property("src")?.Value ?? src; // ...
它仍然有点不尽如人意,但我会这样写:
var src = ParentContent == null ? null : ParentContent.Image("thumbnail") == null ? null : ParentContent.Image("thumbnail").Property("src") == null ? null : ParentContent.Image("thumbnail").Property("src").Value;