2012-01-31 130 views
3
public Dictionary<string, string> Data { get; set; } 

通過上面的代碼行,我得到一個樣式警察錯誤,CA2227集合屬性應該是隻讀的。CA2227 With Dictionary有什麼解決方法?

有沒有什麼方法可以在不添加Stylecop抑制或創建自己的只讀字典類的情況下移過該錯誤?

回答

7

看起來你只需要刪除「設置」關鍵字。例如:

private readonly Dictionary<string, string> data = new Dictionary<string, string>(); 

public Dictionary<string, string> Data { get { return this.data; } } 

通常情況下,您不需要重新分配集合,而只需清除現有集合即可。 我想這就是警告的來源。上面的示例是我大部分時間使用的方法。

+0

謝謝。我確實嘗試過類似的東西,但並不完全,有那麼一段時間! – DevDave 2012-01-31 13:08:07

3

不知道,但下面可能會取消錯誤:

public Dictionary<string, string> Data { get; private set; } 

說實話,這是愚蠢的,你的發展阻礙由於風格的人的主觀想法(又名了StyleCop和的FxCop)。

+3

不同意。 Stylecop和FxCop都很棒。修正所有違規的FxCop(修正開發團隊選擇的所有Stylecop規則是一個好主意)只是愚蠢的,但理解產生的警告總是**一個好主意。 – ken2k 2012-01-31 13:11:12

+0

我確實嘗試過,但我得到了CA1811:set似乎沒有上游公衆或受保護的呼叫者。哦,我很喜歡Style/Fx Cop! – DevDave 2012-01-31 13:12:42

+0

@ ken2k:這是**你的**意見。我的是不同的。編譯器警告總是很好。毫無意義的是任何小於警告級別4的東西。 – leppie 2012-01-31 13:13:08

2

這是一個代碼分析(以前稱爲FxCop)警告,而不是StyleCop。 這是CA2227,而不是CA1227。

請參閱this MSDN article這是很明顯的問題。

請嘗試以下(私人二傳手),以解決它:

public Dictionary<string, string> Data { get; private set; } 
+0

對不起,我的壞錯誤的代碼和錯誤的警察! – DevDave 2012-01-31 13:14:57

0

我發現這個特別的建議/警告的問題是,「修復它」的開發人員通常最終會編寫經常不必要的副本,而不是使用對原始集合的引用。例如,我有以下行:

myThing.Items = GetItems(); 

而且開發與修復它:

var items = GetItems(); 

foreach (var item in items) 
{ 
    myThing.Items.Add(item); 
} 

想象GetItems()返回的百萬項的集合。這怎麼可能是一件好事?我發現微軟的聲明「不要排除此規則的警告」。在MSDN中有點強大!

相關問題