0

我有這樣的代碼:如果實例已存在,是否忽略泛型列表構造?

if (null == _priceComplianceSummaryList) 
{ 
    _priceComplianceSummaryList = new List<PriceComplianceSummary>(); 
} 

ReSharper的標誌這是個問題,這表明,如果我默許「‘如果’與各自的分支語句替換」,上述變化的代碼:

_priceComplianceSummaryList = new List<PriceComplianceSummary>(); 

然而,R#似乎更多的是「貓」的皮帶和吊帶類型,它促使我在引用它之前總是檢查是否有空。那麼,這表面上魯莽的行爲其實只是一個效率問題? IOW,「新列表<>」僅在istance變量(_priceComplianceSummaryList)爲空時生成新列表,而不必顯式檢查該列表嗎? 「

+1

「IOW,如果istance變量爲」null「,那麼'new List <>'只會生成一個新列表,而不必明確檢查?不,它不。 – Logerfo

+6

我可以看到R#暗示這一點的唯一原因是因爲當您進行此檢查時,它可以確定'_priceComplianceSummaryList'是* always * null。你在一個構造函數中,沒有靜態初始化字段,使得檢查冗餘。在實例化一個List [List ]時,'new'關鍵字沒有什麼特別之處 - 在_priceComplianceSummaryList不會被賦值爲'null'之後,以及之前的任何值(如果有的話),它是null還是不,它將不再有。 –

+2

你可以在你定義這個變量的地方顯示代碼嗎?另外,變量的範圍是什麼?請顯示所有相關的代碼。 –

回答

2

」用相應分支替換'if'語句「R#建議意味着當布爾表達式返回false時不存在場景。例如,

void SomeMethod(bool firstParam) 
{ 
    var secondParam = true; 
    if (firstParam || secondParam) 
    { 
     Console.WriteLine(); 
    } 
} 

此代碼將由R#重構,因爲firstParam || secondParam始終爲真。

然後,你的2個代碼例子並不總是等價的,但在你的場景中它們是。