【问题标题】:Null Propagation - Execute function upon null check空值传播 - 在空值检查时执行函数
【发布时间】:2017-11-15 22:53:56
【问题描述】:

这可以使用 Null 传播运算符 (??) 来实现吗?

origObj = model.ProjectId != null ? GetObj(model.ProjectId.Value) : null;

【问题讨论】:

  • 您需要让GetObj 决定如何处理null 输入,否则您需要在调用它时到处进行检查。

标签: c# null-propagation-operator


【解决方案1】:

不,null 传播在这里对您没有帮助,因为它的工作方向与您想要的相反。

它将检查第一部分是否为空,只有在这种情况下才运行第二部分。我无法想象你将如何反转它。

但正如@JohanP 所说,将检查移到您的函数中会更好:

public object GetObj(object input)
{
   if (input == null) return null;
   ....
}

origObj = GetObj(model.ProjectId);

【讨论】:

    【解决方案2】:

    这可以使用 Null 传播运算符 (??) 来实现吗?

    var origObj = model.ProjectId != null ? GetObj(model.ProjectId.Value) : null;
    

    首先,?? 运算符是 Null Coalescing 运算符。如果你想使用它,它只是意味着如果?? 的左侧为空,则执行右侧,否则执行左侧。所以在你的情况下它不会起作用,因为如果你要写这个:

    var origObj = model.ProjectId ?? GetObj(model.ProjectId.Value);
    

    这意味着:如果model.ProjectId 不为空,则将其分配给origObj。否则,从GetObj(model.ProjectId.Value) 分配返回值,它会崩溃,因为model.ProjectId 为空。

    Null Propagation 运算符? 的工作方式如下:如果? 的左侧不为空,则对其调用。例如:

    public class Foo
    { 
        public void Bar() {}
    }
    
    var foo = new Foo();
    foo?.Bar();
    

    在您的情况下,三元运算符会很好。但这一切都取决于GetObj 方法的返回类型。如果该方法返回void,那么它将无法编译。如果该方法返回原始类型,那么您将需要像这样进行强制转换,因为三元运算符的两个分支必须返回相同的类型。例如,如果 GetObj 正在返回 bool,那么您将需要这个:

     var origObj = model.ProjectId != null 
         ? GetObj(model.ProjectId.Value) : 
         (bool?)null;
    

    遇到问题

    最后,如果您将空检查留给GetObj 方法,您可能会遇到麻烦,如果GetObj 方法是这样的,您的程序可能会崩溃:

    public object GetObj(object value)
    {
        if (value == null)
        {
            throw new InvalidOperationException("Cannot call with null");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-11-21
      • 2017-04-20
      • 2012-04-08
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      相关资源
      最近更新 更多