2016-07-20 20 views
2

Ich habe über den in C# 6.0 eingeführten Operator Null Conditional gelesen, aber ich verstehe ihn nicht vollständig.Null bedingter Operator wertet nur einmal aus

Von https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6

int? first = customers?[0].Orders.Count(); 

Dieses Beispiel ist im wesentlichen äquivalent zu:

int? first = (customers != null) ? customers[0].Orders.Count() : null; 

Abgesehen davon, dass Kunden nur einmal ausgewertet wird.

Kann jemand den 'einmal bewerteten' Vers (ich nehme an) zweimal auswerten?

Antwort

1

Hier ist eine bessere Äquivalenz auf Ihre erste Aussage

var temp = customers; 
int? first; 
if(temp != null) 
{ 
    first = temp[0].Orders.Count(); 
} 
else 
{ 
    first = null; 
} 

Die Variable customers wird nur einmal „berührt“. Dies ist signifikanter, wenn customers eine Eigenschaft ist, die eine Aktion in der get ausführt oder eine Funktion ist.

private int accessCount = 0; 
private Customers[] _customers; 
private Customers[] customers 
{ 
    get 
    { 
     accessCount++; 
     return _customers; 
    } 
    set 
    { 
     _customers = value; 
    } 
} 

In Ihrem zweiten Beispiel die customers Eigenschaft würde „berührt“ zweimal, einmal für die Nullprüfung einmal für den Indexer sein, accessCount ein Wert von 2 geben.

+0

Das ist genau das, was ich brauchte. Vielen Dank –

1

Es bedeutet, dass das Programm nur einmal auf customers zugreift. Im zweiten Beispiel wird auf customers zweimal zugegriffen, zuerst für den Null-Check und zweitens für die Orders-Eigenschaft, wenn es nicht null ist.

In der neuen Funktion wird auf customers nur einmal zugegriffen, und wenn es nicht null ist, wird nicht erneut darauf zugegriffen (z. B. ist es nicht möglich, dass es null wird, wenn etwas das Feld ändert) Bereits zugegriffenes Objekt wird verwendet.

Verwandte Themen