2017-12-13 3 views
0

Dies bezieht sich speziell auf einige C# -Eigenschaften, die ich neu schreiben möchte.Leistung und Kompilierung des Nullfortpflanzungsoperators

Beispiel für eine der ursprünglichen Eigenschaften:

public double? PartQuantity 
{ 
    get 
    { 
     if(MaintenanceRequestPart != null) 
      return MaintenanceRequestPart.ReportedQuantity.HasValue 
       ? (double?)MaintenanceRequestPart.ReportedQuantity.Value 
       : null; 

     return null; 
    } 
} 

Was dies geändert wird:

public double? PartQuantity => MaintenanceRequestPart?.ReportedQuantity; 

Anmerkung 1:MaintenanceRequestPart kann

Anmerkung 2 null sein:MaintenanceRequestPart.ReportedQuantity ist ein nullfähiges Doppel

Werden einige Operationen/Verzweigungen/Overhead gespeichert oder hinzugefügt? Ich bin gespannt, was das ist. Der Operator übersetzt sich tatsächlich hinter die Kulissen, sobald er in eine Zwischensprache umgewandelt wurde.

+1

Da 'ReportedQuantity' zu verlieren, ist schon ein Nullable-Doppel, im ursprünglichen Code, warum Sie nicht einfach tun,' if (MaintenanceRequestPart! = Null) return MaintenanceRequestPart.ReportedQuantity; ' – dbc

+2

Aber auch siehe https://ericlippert.com/2012/12/17/performance-rant/. Warum nicht selbst testen? – dbc

+0

Wenn Sie wissen wollen, was die IL für diesen Code sein wird, dann kompilieren Sie es und schauen Sie sich die IL an. Sie brauchen uns nicht, um es für Sie zu kompilieren. – Servy

Antwort

4

Das ist völlig in Ordnung. Der einzige Unterschied besteht darin, dass die Referenz dieser Variablen auf die IL-Ebene kopiert. Das ist also bedeutet basicaly dass:

public double? PartQuantity => MaintenanceRequestPart?.ReportedQuantity; 

ist das gleiche wie:

public double? PartQuantity 
{ 
    get 
    { 
     var value = MaintenanceRequestPart; 
     return value == null ? null : value.ReportedQuantity; 
    } 
} 

Warum es hat diese zusätzliche Kopieren tun? Die Antwort ist ziemlich einfach - um Wert für atomare Entscheidung zu erfassen, wenn dieser Wert von verschiedenen Threads zugegriffen wird. Es ist sehr nützlich, wenn Sie mit Ereignissen arbeiten (so wird es nicht Nullreferenceexception in der Mitte der Betreiber werfen „?“):

public event EventHandler OnSomethingHappened; 
... 
OnSomethingHappened?.Invoke(this, new EventArgs()); 

Aber keine Angst, es nicht sinnvoll Einfluss auf die Leistung haben.

Urteil: Sie können dieses Refactoring tun, ohne etwas

+1

Ich wäre sehr zuversichtlich, dass es keine Auswirkungen auf die Performance haben wird, da es nur ein Compiler semantischen Zucker ist. –