2016-03-23 8 views
0

Ich habe daran gearbeitet, älteren Code in unseren Repos zu refactorieren, und ein Gedanke kam mir in den Sinn. Es gibt mehrere Stellen, an denen if-Anweisungen verwendet werden, um zu bestimmen, ob eine bestimmte Eigenschaft oder Variable einen Wert enthält, und wenn kein Wert vorhanden ist, wird ihr ein Wert zugewiesen. Diese treten jedoch typischerweise in langen Ketten auf und sind etwas unhandlich.Leistung von Inline-Null-Check vs If-Block?

Gibt es einen signifikanten Kopf oder Nachteil etwas wie folgt zu ersetzen:

if (memo.DateTime == null) 
{ 
    memo.DateTime = DateTime.Now; 
} 

if (memo.dtoDate == null) 
{ 
    memo.dtoDate = DateTimeOffset.Now; 
} 

mit diesem:

memo.DateTime = memo.DateTime ?? DateTime.Now; 
memo.dtoDate = memo.dtoDate ?? DateTimeOffset.Now; 

+1

Benchmark es. Zeit jede in einer Schleife (10.000 Iterationen) und sehen, welche ist am schnellsten. Ich wäre überrascht, wenn Sie einen signifikanten Unterschied finden könnten. – ChrisF

+3

[Rennen Sie Ihre Pferde] (http://ericlippert.com/2012/12/17/performance-rant/) –

+0

Ich denke, meine Hauptfrage ist, wenn es einen Grund gibt, sollte ich nicht die zweite Methode verwenden. Ich habe noch nie solche Selbsteinsätze gesehen, wie sie im Produktionscode verwendet werden, und es schien einfach so eine offensichtliche Lösung zu sein. –

Antwort

2

Es sieht aus wie Syntax Zucker:

 object test = Console.ReadLine(); 
     if (test == null) 
     { 
      test = "default"; 
     } 

     object test2 = Console.ReadLine() ?? "default"; 

in IL Freigabe

 IL_0000: call string [mscorlib]System.Console::ReadLine() 
     IL_0005: stloc.0 
     IL_0006: ldloc.0 
     IL_0007: brtrue.s IL_000f 

     IL_0009: ldstr "default" 
     IL_000e: stloc.0 

     IL_000f: call string [mscorlib]System.Console::ReadLine() 
     IL_0014: dup 
     IL_0015: brtrue.s IL_001d 

     IL_0017: pop 
     IL_0018: ldstr "default" 

     IL_001d: stloc.1