2017-12-13 11 views
0

これは特に、書き直したいC#プロパティを参照しています。元のプロパティの1のnull伝播演算子のパフォーマンスとコンパイル

例:

public double? PartQuantity => MaintenanceRequestPart?.ReportedQuantity; 

注1:MaintenanceRequestPartがnull

注2することができ、これはに変更されますどのような

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

     return null; 
    } 
} 

MaintenanceRequestPart.ReportedQuantityはヌルブルブルです

これは、いくつかの操作/分岐/オーバーヘッドを保存するか追加しますか?私は何が好きですか?オペレータは実際に中間言語に変換されると、実際には背後に翻訳されます。

+1

を失うことなく、このリファクタリングを行うことができますReportedQuantity'がすでにNULL可能ダブルで 'ので、元のコードでは、なぜあなたは、単に(MaintenanceRequestPart = nullで!)場合は'行っていませんreturn MaintenanceRequestPart.ReportedQuantity; ' – dbc

+2

また、https://ericlippert.com/2012/12/17/performance-rant/も参照してください。自分でテストしてみませんか? – dbc

+0

ILがそのコードに対して何をするかを知りたい場合は、ILをコンパイルして調べます。あなたは私たちがあなたのためにそれをコンパイルする必要はありません。 – Servy

答えて

4

これは完全に問題ありません。唯一の違いは、はILレベルでこの変数の参照をコピーすることです。だから、これはbasicalyであることを意味します

public double? PartQuantity => MaintenanceRequestPart?.ReportedQuantity; 

は同じです:

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

なぜそれがこの追加のコピーをしましたか?この値が異なるスレッドからアクセスされた場合、アトミックなdesicionの値を取得するという答えは非常に簡単です。

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

しかし、それはパフォーマンス上の合理的な影響を与えることはありません、恐れていない:それはあなたがイベントを操作するとき(「?」オペレータので、それはの真ん中にとNullReferenceExceptionがスローされません)非常に便利です。

評決:あなたが事

+1

実際にはコンパイラの意味論的な砂糖なので、パフォーマンスに影響がないと私は確信しています。 –