我的电话是例如:
var bankacc = workReport.works.customers.bankaccounts.Name;
表示works
可以为null,customers
可以为null,bankaccounts
也可以为null。如果是或否,我不想检查每一个。我可以使用某种方法来检查整个语句吗?如果为null则返回空字符串吗?
编辑:
我正在使用.NET FM 4.5
答案 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;