2016-03-23 3 views
0

私はreposでいくつかの古いコードをリファクタリングすることに取り組んできました。思考が私の頭を越えました。特定のプロパティまたは変数に値が含まれているかどうかを判断するためにif文が使用される場所がいくつかあり、値がない場合は値が割り当てられます。しかしながら、これらは典型的には長い鎖で起こり、やや扱いにくい。これでif-blockに対するインラインNullチェックのパフォーマンス?

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

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

は、有意な上振れまたは下振れがこのような何かを交換してあります

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

+1

ベンチマークです。それぞれのループの時間(10,000回の繰り返し)を見て、どれが最速かを確認します。私はあなたが大きな違いを見つけることができれば驚くだろう。 – ChrisF

+3

[あなたの馬の競走](http://ericlippert.com/2012/12/17/performance-rant/) –

+0

私の主な質問は、2番目の方法を使用すべきではない理由があるかどうかということです。プロダクションコードで使用されているような自己割り当ては見たことがありませんでした。 –

答えて

2

それはシンタックスシュガーのようになります。

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

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

ILリリース

 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 
関連する問題