在C#中避免NullReferenceException的优雅方法

AK_*_*AK_ 7 .net c# syntax web

我想做这个

var path = HttpContext.Current.Request.ApplicationPath;
Run Code Online (Sandbox Code Playgroud)

如果沿途的任何属性为null,我希望路径为null,或者""会更好.

没有三元有没有一种优雅的方式来做到这一点?

理想情况下,我希望这种行为(没有可怕的性能和丑陋)字符串路径;

try
{
    path = HttpContext.Current.Request.ApplicationPath;
}
catch
{
    path = null;
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Pat*_*iek 11

[编辑]

C#6刚刚发布了它,它附带了null传播的运算符?.,这将简化你的情况:

var path = HttpContext?.Current?.Request?.ApplicationPath
Run Code Online (Sandbox Code Playgroud)

由于历史原因,可以在下面找到以前语言版本的答案.


我想你正在寻找Groovy的安全解除引用运算符?.,而你不是第一个. 从链接的主题,我个人最喜欢的解决方案就是这个(那个看起来也很不错).然后你可以这样做:

var path = HttpContext.IfNotNull(x => x.Current).IfNotNull(x => x.Request).IfNotNull(x => x.ApplicationPath);
Run Code Online (Sandbox Code Playgroud)

您可以随时缩短功能名称.如果表达式中的任何对象为null,则返回null,否则返回ApplicationPath.对于值类型,您必须在结尾执行一次空检查.无论如何,到目前为止没有别的方法,除非你想在每个级别检查null.

这是上面使用的扩展方法:

    public static class Extensions
    {
    // safe null-check.
    public static TOut IfNotNull<TIn, TOut>(this TIn v, Func<TIn, TOut> f) 
            where TIn : class  
            where TOut: class 
            { 
                    if (v == null) return null; 
                    return f(v); 
            }       
    }
Run Code Online (Sandbox Code Playgroud)