2016-08-24 52 views
5

我正在尋找一個錯誤提升來防止構建,如果我的靜態字典中有重複的鍵。編譯器檢查字典中的鍵是否唯一

我下面

public static readonly Dictionary<string, string> Fruits = new Dictionary<string, string> 
{ 
    {"Sobeys", "Apples"}, 
    {"NoFrills", "Oranges"} 
} 

但可以說,有人不小心改變索貝斯是Nofrills,我想一個編譯器錯誤當前字典待提高,以防止任何東西要做,直到重複鍵解決。請問可能嗎?如果是這樣,我會怎麼做?

public static readonly Dictionary<string, string> Fruits = new Dictionary<string, string> 
{ 
    {"NoFrills", "Apples"}, 
    {"NoFrills", "Oranges"} 
} 
+4

你必須,如果你希望它有比C#的規則,不同的行爲寫自己的編譯器。 – Servy

+3

您使用的是Visual Studio 2015或更新版本?如果是這樣,可以使用自定義[實時代碼分析器](https://msdn.microsoft.com/en-us/magazine/dn879356.aspx),但它將成爲一項非繁雜的工作量強大的。 –

+0

@Servy因爲C#是開源的,所以也許應該向社區提交補丁。 https://github.com/dotnet/roslyn –

回答

6

你也可以使用下面的黑客(我不推薦它):將匿名類型轉換爲字典。 匿名類型不允許重複的屬性名稱。

例子:

Dictionary<string, string> Fruits = ToDictionary(
    new 
    { 
     Sobeys = "Apples", 
     NoFrills = "Oranges" 
    } 
); 

但這種方法有以下限制:只能有有效的標識符在你的字典鍵。

如何實現ToDictionary方法有描述: In c# convert anonymous type into key/value array?

+0

有趣的,我會給這個快速嘗試! – Master

+2

這是一個非常聰明的想法。 – sstan

+0

嗨,絕對是黑客,但這基本上是我想要的。謝謝@ just.ru – Master

8

不,這是一個運行時間的事情。一旦這個類被加載到內存中,它將拋出一個異常(這本質上是運行時)。

您可以通過診斷分析器添加自定義檢查,但這對獲得非常小的收益會很痛苦。我建議你保持原樣,並密切關注新部署的例外情況。您可以隨時添加評論,以便向其他開發者明確說明密鑰必須是唯一的,但是您在哪裏停止?開發人員應該知道這樣的基本框架規則。

例如,您也可以使用枚舉作爲密鑰,當您嘗試添加已存在的內容時,它會在devtime中將其清除。另一種選擇是參考const string字段,儘管它仍然有些脆弱。

+1

我幾乎想和你說一樣的東西,但是我唯一要補充的是這個單元測試能很好地抓住 –

+0

@ScottChamberlain單元測試對於通過方法完成添加是有幫助的,但是您在初始化課程 –

+0

@JeroenVannevel時是否已經重複進行單元測試?訪問該屬性將失敗,並出現異常 - 所以使用它的測試將失敗......不知道爲什麼你會寫出測試成功,當拋出異常... –

1

C#編譯器不提供這種可能性。 您將在運行時得到一個異常。

要解決這個問題,您必須實現自己的預處理檢查或處理運行時異常。

1

我想一個編譯器錯誤,以提高

這是錯誤。這就是編譯器不會發出編譯時錯誤的原因。集合初始化器是語法糖,並被翻譯成各自的Add()方法(或者在替代語法的情況下爲索引器)調用。

您最好的選擇是依靠一些第三方代碼分析工具,可以發現潛在的錯誤。

相關問題