2009-02-03 44 views
6

在我的代碼中有幾個字符串被用作訪問資源的關鍵字。這些鍵具有特定的格式,例如在C編譯時檢查字符串格式#

string key = "ABC123"; 

目前,所有這些鍵都存儲爲字符串,但我想使事情更健壯和類型安全。理想情況下,我想在編譯時檢查字符串格式是否正確。

下一階段是創建一個從字符串初始化的ResourceKey類。然後,我可以在運行時檢查字符串的格式,例如

ResourceKey key = "ABC123"; 

那裏獲取ResourceKey被定義爲:

using System.Diagnostics; 
using System.Text.RegularExpressions; 

class ResourceKey 
{ 
    public string Key { get; set; } 

    public static implicit operator ResourceKey (string s) 
    { 
     Debug.Assert(Regex.IsMatch(s, @"^[A-Z]{3}[0-9]{3}$")); 
     return new ResourceKey() { Key = s }; 
    } 
} 

我真正想要做的是使程序無法構建,如果有人試圖使用有一種編譯時斷言的一個無效的密鑰。例如

ResourceKey k1 = "ABC123"; // compiles 
ResourceKey k2 = "DEF456"; // compiles 
ResourceKey k3 = "hello world"; // error at compile time 

有什麼辦法可以達到這個目的嗎?

謝謝

回答

8

您可以使用單元測試檢查值。我的一位同事必須在一個項目中做類似的事情,我們需要確保某個名稱空間中的所有類都具有適用於它們的特定屬性。

使用您的構建運行單元測試(您是否正確?:)或作爲集成構建的一部分。這樣可以保持源代碼更清潔,並且不必引入執行斷言的代碼。

+0

我同意這一點,我建議還請檢查http://www.postsharp.org/ 確保/在邏輯之後 – kentaromiura 2009-02-03 12:38:11

+0

好主意 - 但不幸的是這些密鑰分散在數以萬計的遺留代碼行中 - 絕大多數不在單元測試中。儘管我們到了! – roomaroo 2009-02-04 09:42:01

+0

對不起,聽說! – 2009-02-04 11:21:16

1

您是否真的想將這些密鑰硬編碼到您的應用中?將它們放在配置文件中不是更好嗎?那麼如果編譯後有任何問題,那只是一個運行時配置問題。

2

我相信我會添加一個設置類並將它們存儲在那裏而不是創建一個新類型。 Settings類可以由應用程序配置文件支持,如果需要,可以通過配置文件更改更容易地進行更改。但是,如果您不在配置文件中指定它們,它將使用您設置的默認值。

我也會去單元測試路線。你需要在你的Assembly.cs文件中使用InternalsVisibleTo屬性,因爲如果你不這樣做的話,我不認爲這個設置可以在項目之外使用。

1

AdamRalph有一個點,但櫃檯點也適用,如果你得到它的權利在編譯時,你將永遠不會有運行時配置的問題(假設正確的值不能改變)

之外的, C#的編譯時間絕對是垃圾。他們在編譯時沒有任何事可做。我所知道的最好的是模板where子句。如果我不得不猜測,我會說這是Anders Hejlsberg的有意設計選擇,因爲它似乎與其他語言相匹配

Andrew Hare關於單元測試+反射的觀點與我一樣好期望。我的一名同事使用它來測試在特定情況下可以使用的任何類是否正確實施了某些協議。

1

如果密鑰按照相同的規則C#標識符,或者命名更加限制,和已知的和有限的,你可以使用一個枚舉:

public enum ResourceKeys 
{ 
    ABC123, 
    DEF456 
}