【问题标题】:When the null conditional operator short-circuits, does it still evaluate method arguments?当 null 条件运算符短路时,它是否仍然评估方法参数?
【发布时间】:2017-08-05 12:15:38
【问题描述】:

null 条件运算符可用于跳过对 null 目标的方法调用。在这种情况下是否会评估方法参数?

例如:

myObject?.DoSomething(GetFromNetwork());

myObjectnull 时是否调用GetFromNetwork

【问题讨论】:

    标签: c# c#-6.0 null-conditional-operator


    【解决方案1】:

    他们不会被评估。

    class C
    {
        public void Method(int x)
        {
            Console.WriteLine("Method");
        }
    }
    
    static int GetSomeValue()
    {
        Console.WriteLine("GetSomeValue");
        return 0;
    }
    
    C c = null;
    c?.Method(GetSomeValue());
    

    这不会打印任何内容。 Resharper 将GetSomeValue()的评估标记为死代码:

    【讨论】:

      【解决方案2】:
      myObject?.Method();
      

      基本上等价于

      var temp = myObject;
      if (temp != null) {
          temp.Method();
      }
      

      您会看到,如果 myObjectnull,则无法评估任何参数。

      请注意,如果您将 myObject 替换为

      【讨论】:

      • 它们不是等价的。具体来说,前者只计算一次object,如果非null,后者计算两次。由于它们不等价,因此不应从中得出任何结论。
      • @hvd 他们是。甚至在规范中也如此说明(字面意思!)。并且由于它是一个变量,因此没有双重评估。 github.com/ljw1004/csharpspec/blob/gh-pages/…
      • 它们不是一般的,正如您链接到的规范中所述:“除了 P 只被评估一次。”,后来“除了 P 只被评估一次。”,但后来“除了 P 只计算一次。”,最后“除了 a.b 和 a.b[0] 只计算一次。”和“除了 a.b 和 a.b[0] 只被评估一次。”是的,对于局部变量,双重评估不会改变结果。这是 only 例外的部分将是您答案的一个很好的补充,IMO。
      猜你喜欢
      • 2013-06-02
      • 1970-01-01
      • 2021-09-23
      • 2011-10-24
      • 2015-11-02
      相关资源
      最近更新 更多