嵌套空值检查C#的简写

Mys*_*ter 21 c# language-features

据我所知,没有一个显著写以下更优雅的方式....

string src;
if((ParentContent!= null)
    &&(ParentContent.Image("thumbnail") != null)
    &&(ParentContent.Image("thumbnail").Property("src") != null))
    src = ParentContent.Image("thumbnail").Property("src").Value
Run Code Online (Sandbox Code Playgroud)

你认为应该有一个C#语言功能来缩短它吗?
如果是这样,它应该是什么样的?
例如,像延伸?? 操作者

string src = ParentContent??.Image("thumbnail")??.Property("src")??.Value;
Run Code Online (Sandbox Code Playgroud)

为相当人为的例子和我过度简化的解决方案道歉.

编辑...许多年后
这是一个计划的语言功能,称为" 空传播运算符 " ?. https://roslyn.codeplex.com/discussions/540883(谢谢@Brian)

Tom*_*cek 18

没有内置语法来执行此操作,但您可以定义扩展方法来执行此操作:

R NotNull<T, R>(this T src, Func<T, R> f) 
    where T : class where R : class {
  return src != null ? f(src) : null;
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以按如下方式重写示例:

src = ParentContent.NotNull(p => p.Image("thumbnail")).
        NotNull(i => i.Property("src")).NotNull(src => src.Value);
Run Code Online (Sandbox Code Playgroud)

它不像语法支持那么好,但我会说它更具可读性.

请注意,这会将NotNull方法添加到所有.NET类型,这可能有点不方便.您可以通过定义WrapNull<T> where T : class仅包含type值的简单包装类型T和将任何引用类型转换WrapNull为类型并提供类型的方法来解决NotNull此问题WrapNull.然后代码看起来像这样:

src = WrapNull.Wrap(ParentContent).NotNull(p => p.Image("thumbnail")).
        NotNull(i => i.Property("src")).NotNull(src => src.Value);
Run Code Online (Sandbox Code Playgroud)

(因此,您不会使用新的扩展方法污染每种类型的IntelliSense)

通过更多的努力,您还可以定义LINQ查询运算符来执行此操作.这有点矫枉过正,但是可以这样写(我不会在这里包含定义,因为它们有点长,但有可能有人感兴趣:-)).

src = from p in WrapNull.Wrap(ParentContent)
      from i in p.Image("thumbnail").
      from src in i.Property("src")
      select src.Value;
Run Code Online (Sandbox Code Playgroud)

  • 我不得不说,我必须阅读大约5次才能正确地理解它.有时阅读功能代码让我后悔开始使用程序风格的语言,而不是说LISP.其他日子,我感谢我的理智,我没有!:d (2认同)

Aar*_*ght 16

它被建议并且显然被团队拒绝:

为空值多一点C#语法糖

建议的语法看起来像a.?b.?c()- 非常有用,而且毫不含糊.

我也很想看到它,但看起来不会发生.也许如果有足够的人投票呢!


Eri*_*ert 15

我们考虑过C#4,但没有预算.这是很多人要求的一个很好的功能,所以也许我们会把它变成一个未来的假设语言版本.没有承诺.

  • 有一天,埃里克将度过漫长的一天,而且会太累了.在那一天,他会说,"我们正在考虑将其用于下一版本的C#." (9认同)