根据 C# 中的提取结果设置变量的值

本文关键字:设置 变量 结果 提取 根据 | 更新日期: 2023-09-27 18:18:26

var d = get(x).Title;
var e = get(y).Title;

如果 get(y( 返回 null,则获取 Title 会给出异常。但是,我需要的是,如果 get(y( 为空并且没有生成异常,则 e 为空。我可以通过 get(y( 的两个步骤来做到这一点,但我只想做一次 get(y(。

有没有一些简单的一行方法,如果 get(y( 为 null,或者如果 get(y( 不返回 null,则实际值为 null,我只需要一个 get(y( 并将一行代码设置为 null?

根据 C# 中的提取结果设置变量的值

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);

您可以使用内联条件语句(或三元运算符(,如下所示:

var e = get(y) != null ? get(y).Title : null;

但是,您可能希望采取"原始"路线(我知道,我知道,单行风靡一时(,如果不为别的,只是为了尽量减少对get的调用(您确实将其声明为一个问题(,这很简单:

string e = null;
var somethingOrOther = get(y);
if (somethingOrOther != null) {
    e = somethingOrOther;
}

据我所知,恐怕是非此即彼——其他人可能知道我不知道的事情,或者乔恩·斯基特可能会为你编造一些邪恶,但这就是我的立场(其他任何东西似乎只是相同方法的变体(。

此外,由于现在意识到可能的重复,但为了完整起见,我将引用 Eric Lippert 关于"如果对象为空则为 null,则为 object.member">

没有简短的形式;实现一个是相当公平的。 经常请求的功能。

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();

您必须使用三级运算符:

var e = (get(y) == null ? null : get(y).Title).

如果get(y)操作成本很高,则需要将其缓存在另一个变量中。