var d = get(x).Title;
var e = get(y).Title;
如果get(y)返回null,则获取Title会产生异常。但是我需要的是,如果get(y)为null并且没有生成异常,则e为null。我可以用get(y)的两个步骤来做到这一点,但我想只做一次get(y)。
如果get(y)为null,那么只有一个get(y)和一行代码集e为null,如果get(y)不返回空?
答案 0 :(得分:2)
var z = get(y);
var e = z != null ? z.Title : null;
您还可以使用以下扩展方法:
public static TResult IfNotNull<T, TResult>(this T obj, Func<T, TResult> selector)
where T : class
{
return obj.IfNotNull(selector, default(TResult));
}
public static TResult IfNotNull<T, TResult>(this T obj, Func<T, TResult> selector, TResult valueIfNull)
where T : class
{
if (obj == null)
return valueIfNull;
return selector(obj);
}
...
var e = get(y).IfNotNull(_ => _.Title);
答案 1 :(得分:1)
var d = get(x) != null ? get(x).Title : null;
由于您声明只允许调用get(x)
get(y)
,因此您可以按如下方式编写
var X = get(x);
var d = X != null ? X.Title : null;
这是编写代码的最短路径,但我认为编写所有这些的更清晰的方法是使用某种形式的函数调用的扩展方法来处理它,因为这是你必须要做的事情多个变量
示例扩展方法
public static TypeOfTitle GetTitle(this TypeOfget x)
{
return x != null ? x.Title : null;
}
然后按如下方式调用
var d = get(x).GetTitle();
答案 2 :(得分:1)
您可以使用内联条件语句(或三元运算符),如下所示:
var e = get(y) != null ? get(y).Title : null;
然而,你可能想要采用“原始”路线(我知道,我知道,单行是风靡一时),如果只是为了最小化对get
的调用(你做的话)国家作为一个问题),这将只是:
string e = null;
var somethingOrOther = get(y);
if (somethingOrOther != null) {
e = somethingOrOther;
}
据我所知,我担心这是其中之一 - 其他人可能知道我不知道的事情,或者Jon Skeet可能为你编造一些邪恶,但这就是我的立场(其他任何事情似乎只是为了是相同方法的变种。)
此外,由于现在知道possible duplicate,但为了完整性,我将引用Eric Lippert的“如果object为null,则为null;如果object为非null,则引用object.member”:
没有简短的形式;实施一个是公平的 经常要求的功能。
答案 3 :(得分:0)
您必须使用三元运算符:
var e = (get(y) == null ? null : get(y).Title).
如果get(y)
是一项昂贵的操作,您需要将其缓存在另一个变量中。