2017-08-05 1 views

Répondre

4

Ils ne seront pas évalués.

class C 
{ 
    public void Method(int x) 
    { 
     Console.WriteLine("Method"); 
    } 
} 

static int GetSomeValue() 
{ 
    Console.WriteLine("GetSomeValue"); 
    return 0; 
} 

C c = null; 
c?.Method(GetSomeValue()); 

Ceci n'imprime rien. ReSharper marque l'évaluation de GetSomeValue() code mort:

enter image description here

0
myObject?.Method(); 

est essentiellement équivalente à

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

Vous voyez qu'aucun argument ne peut être évalué si myObject est null.

Notez que si vous remplacez myObject par

+0

Ils ne sont pas équivalents. Spécifiquement, le premier n'évalue 'object' qu'une seule fois, le second deux fois s'il n'est pas' null'. Comme ils ne sont pas équivalents, aucune conclusion ne devrait en être tirée. – hvd

+0

@hvd Ils sont. Il est indiqué comme ceci même dans les spécifications (* littéralement! *). Et puisque c'est une variable, il n'y a pas de double évaluation. https://github.com/ljw1004/csharpspec/blob/gh-pages/expressions.md#member-access – Adrian

+0

Ils ne sont pas en général, comme indiqué dans les spécifications que vous liez à: "sauf que P est évalué une seule fois . ", plus tard" sauf que P est évalué une seule fois. ", mais plus tard" sauf que P est évalué une seule fois. ", enfin" Sauf que ab et ab [0] ne sont évalués qu'une seule fois. " et "sauf que a.b et a.b [0] sont évalués une seule fois." Oui, pour une variable locale, la double évaluation ne change pas les résultats. La partie que c'est l'exception * seulement * serait un bon ajout à votre réponse, OMI. – hvd