2017-08-05 51 views

回答

4

他们不会被评估。

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()评价为死代码:

enter image description here

0
myObject?.Method(); 

基本上等同于

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

你看,如果myObjectnull没有参数进行评估。

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

+0

它们并不等同。具体来说,前者只评估一次“对象”,后者如果不是“'null”则评估两次。由于它们不相同,因此不应从中得出结论。 – hvd

+0

@ hvd他们是。即使在规格(*字面上!*)中也是如此。由于它是一个变量,因此没有双重评估。 https://github.com/ljw1004/csharpspec/blob/gh-pages/expressions.md#member-access – Adrian

+0

他们不是一般的,正如你链接到的规范中所述:“除了P只评估一次。“,稍后”除了P只评估一次“,但后来”除了P只评估一次“,最后”除了ab和ab [0]只评估一次“。和“除了a.b和a.b [0]只评估一次”。是的,对于局部变量,双重评估不会改变结果。这是* only *例外的部分对您的答案IMO来说是一个很好的补充。 – hvd