检查其中一个子元素是否为空且不抛出异常的最佳方法

时间:2015-01-02 18:23:37

标签: c#

我的电话是例如:

var bankacc = workReport.works.customers.bankaccounts.Name;

表示works可以为null,customers可以为null,bankaccounts也可以为null。如果是或否,我不想检查每一个。我可以使用某种方法来检查整个语句吗?如果为null则返回空字符串吗?

编辑:

我正在使用.NET FM 4.5

6 个答案:

答案 0 :(得分:3)

我不是说这是个好主意,但这是一个可能的解决方案 - 扩展方法。

public static class MyExtensions
{
    public static TResult IfNotNull<TSource, TResult>(this TSource source, Func<TSource, TResult> function)
        where TSource : class where TResult : class
    {
        if (source == null)
            return null;
        return function(source);
    }
}

用法:

var bankacc = workReport.IfNotNull(x => x.works)
                        .IfNotNull(x => x.customers
                        .IfNotNull(x => x.bankaccounts
                        .IfNotNull(x => x.Name) ?? string.Empty;

答案 1 :(得分:2)

这是null-propogating语法 - C#6.0规范中的预期功能(现在如果您想使用VS 2015 Beta),但现在的规范中没有。使用?.的新语法:

var bankacc = workReport?.works?.customers?.bankaccounts?.Name;

使用当前规范(C#5.0)最好的选择是使用一系列变量和if语句,这些语句虽然不优雅,但也是编译器最终在?.运算符的引擎盖。

还应该注意,虽然可能,建议使用异常(即catch { return null; }语句),因为异常会产生大量开销(例如收集{{1} })

答案 2 :(得分:1)

在新的和改进的C#6.0中,您可以使用null conditional operator

执行此操作
var bankacc = workReport?.works?.customers?.bankaccounts?.Name;

if (bankacc == null)
{
    // throw exception
}

答案 3 :(得分:0)

在当前版本的C#中无法做到这一点。在下一个版本中,您将能够

var bankacc = workReport?.works?.customers?.bankaccounts?.Name;

答案 4 :(得分:0)

不,你不能对当前C#中的表达式进行一般的“空”检查。

但是,您可以显式捕获它将生成的NullReferenceException:

string backacc;

try
{
   bankacc = workReport.works.customers.bankaccounts.Name;
}
catch (NullReferenceException nre)
{
   //Catching because I don't like if statements
   bankacc = String.Empty;
}

这不是一个非常的想法,但它避免了所请求的多个if语句。

答案 5 :(得分:0)

替代解决方案,但不推荐,因为它很难维护。我会推荐BradleyDotNet的解决方案。

var bankacc = workReport == null ? string.Empty : workReport.works == null ? string.Empty : workReport.works.customers == null ? string.Empty : workReport.works.customers.bankaccounts == null ? string.Empty : workReport.works.customers.bankaccounts.Name;