C# 基于在C中获取的结果设置变量的值#

C# 基于在C中获取的结果设置变量的值#,c#,C#,如果get(y)返回null,则获取Title会出现异常。然而,我需要的是,如果get(y)为null并且没有生成异常,则e为null。我可以通过两步get(y)来实现这一点,但我只想做一次get(y) 如果get(y)为空,或者如果get(y)不返回空值,则实际值设置为空,那么有没有简单的单行方法可以只使用一个get(y)并使用一行代码将e设置为空 var d = get(x).Title; var e = get(y).Title; 如果get(y)是一个昂贵的操作,您将需要将其缓存在另一

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


如果get(y)为空,或者如果get(y)不返回空值,则实际值设置为空,那么有没有简单的单行方法可以只使用一个get(y)并使用一行代码将e设置为空

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

如果
get(y)
是一个昂贵的操作,您将需要将其缓存在另一个变量中。

您必须使用一个三进制运算符:

var d = get(x).Title;
var e = get(y).Title;
var e = (get(y) == null ? null : get(y).Title).
如果
get(y)
是一个代价很高的操作,则需要将其缓存到另一个变量中

var e = (get(y) == null ? null : get(y).Title).
由于您声明只允许一次调用
get(x)
get(y)
,您可以编写如下代码

var d = get(x) != null ? get(x).Title : null;
public static TypeOfTitle GetTitle(this TypeOfget x)
{
   return x != null ? x.Title : null;
}
这是编写代码的最短方法,但我认为编写所有这些代码的更清晰的方法是使用函数调用的某种形式的扩展方法来处理,因为这是必须对多个变量执行的操作

示例扩展方法

  var X = get(x);
  var d = X != null ? X.Title : null;
那么就这样称呼它

var d = get(x) != null ? get(x).Title : null;
public static TypeOfTitle GetTitle(this TypeOfget x)
{
   return x != null ? x.Title : null;
}
由于您声明只允许一次调用
get(x)
get(y)
,您可以编写如下代码

var d = get(x) != null ? get(x).Title : null;
public static TypeOfTitle GetTitle(this TypeOfget x)
{
   return x != null ? x.Title : null;
}
这是编写代码的最短方法,但我认为编写所有这些代码的更清晰的方法是使用函数调用的某种形式的扩展方法来处理,因为这是必须对多个变量执行的操作

示例扩展方法

  var X = get(x);
  var d = X != null ? X.Title : null;
那么就这样称呼它

var d = get(x) != null ? get(x).Title : null;
public static TypeOfTitle GetTitle(this TypeOfget x)
{
   return x != null ? x.Title : null;
}
您还可以使用以下扩展方法:

var z = get(y);
var e = z != null ? z.Title : null;
public static TResult IfNotNull(此T对象,函数选择器)
T:在哪里上课
{
返回obj.IfNotNull(选择器,默认值(TResult));
}
公共静态TResult IfNotNull(此T对象、函数选择器、TResult valueIfNull)
T:在哪里上课
{
if(obj==null)
返回值ifnull;
返回选择器(obj);
}
...
var e=get(y).IfNotNull(=>.Title);
您还可以使用以下扩展方法:

var z = get(y);
var e = z != null ? z.Title : null;
public static TResult IfNotNull(此T对象,函数选择器)
T:在哪里上课
{
返回obj.IfNotNull(选择器,默认值(TResult));
}
公共静态TResult IfNotNull(此T对象、函数选择器、TResult valueIfNull)
T:在哪里上课
{
if(obj==null)
返回值ifnull;
返回选择器(obj);
}
...
var e=get(y).IfNotNull(=>.Title);

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

    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);
但是,您可能希望采用“基本”路线(我知道,我知道,一行程序非常流行),如果只是为了最大限度地减少对
get
(您确实将其称为一个问题)的调用,这将是:

var e = get(y) != null ? get(y).Title : null;
据我所知,我担心这是一个或另一个-其他人可能知道一些我不知道的事情,或者乔恩·斯基特可能为你编造一些邪恶的东西,但这就是我的立场(其他任何东西似乎都只是相同方法的变体)

此外,由于现在知道了一个,但为了完整性,我将引用Eric Lippert关于“如果对象为null,则为null;如果对象不为null,则为object.member”的内容:

没有简写的形式;实施一个是一个公平的过程 经常请求的功能


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

    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);
但是,您可能希望采用“基本”路线(我知道,我知道,一行程序非常流行),如果只是为了最大限度地减少对
get
(您确实将其称为一个问题)的调用,这将是:

var e = get(y) != null ? get(y).Title : null;
据我所知,我担心这是一个或另一个-其他人可能知道一些我不知道的事情,或者乔恩·斯基特可能为你编造一些邪恶的东西,但这就是我的立场(其他任何东西似乎都只是相同方法的变体)

此外,由于现在知道了一个,但为了完整性,我将引用Eric Lippert关于“如果对象为null,则为null;如果对象不为null,则为object.member”的内容:

没有简写的形式;实施一个是一个公平的过程 经常请求的功能



这不会编译。。。的两个操作数??接线员必须有相同的类型哇,我以前从未见过这个接线员!!如果get(y)为null,Samantha需要返回Title,否则为null。您的代码将返回get(y),如果为null,则返回get(y)。Title.-1-即使编译了此代码,如果
get(x)
返回
null
,则
get(x)。Title
将尝试执行,导致
NullReferenceException
。我注意到并修复了它……完全错误。Woopthis不会编译。。。的两个操作数??接线员必须有相同的类型哇,我以前从未见过这个接线员!!如果get(y)为null,Samantha需要返回Title,否则为null。您的代码将返回get(y),如果为null,则返回get(y)。Title.-1-即使编译了此代码,如果
get(x)
返回
null
,则
get(x)。Title
将尝试执行,导致
NullReferenceException
。我注意到并修复了它……完全错误。我一直希望得到一个没有其他变量的解决方案。这个下面看起来不错,但另一张海报说它不起作用:-(@SamanthaJ:如果没有另一个变量,你就不能这样做,除非你调用get(y)两次。即使是null合并操作符(下面写得不正确)也需要两次调用才能得到(y)@SamanthaJ,有人要求一个
?。
操作符,理论上允许你说
get(x)?.Title
没有空检查,但是没有关于是否在C#的未来版本中包含它的公告,而且现在显然没有。@SamanthaJ:除非这是code golf,否则请使用另一个变量。仍然希望没有其他变量的解决方案。@be