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)
Eri*_*ert 15
我们考虑过C#4,但没有预算.这是很多人要求的一个很好的功能,所以也许我们会把它变成一个未来的假设语言版本.没有承诺.