2012-12-12 64 views
-1

我有一個定義了只讀成員的類定義。獲取C中只讀成員的方法

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

現在爲了測試我的設計,我想在其類定義之外訪問此成員。我正在考慮提供一個get方法,但無法編寫無錯誤語法。

是否可以爲成員分配值(使用new)並仍然可以定義其方法get? PS:我是C#語言的新手。

編輯: 我還沒有寫代碼,它只是一個我已經從一個已經寫好的模塊複製的聲明。我在模塊中進行了一些設計更改,並希望在代碼中儘可能少地進行測試,因此我期望在該類之外只讀訪問此成員。

+3

直接公開內部引用類型通常是一個壞主意 - 考慮從屬性或方法返回字典的副本以確保它不會被用戶修改。 – Oded

+3

你是否試圖提供只讀訪問?你知道一個只讀字典仍然是可變的嗎? –

+3

你想要測試什麼? 'readonly'關鍵字意味着變量只能在構造函數中賦值。不是你不能添加或刪除值/鍵。 – esskar

回答

0

只需創建一個簡單的getter

public Dictionary<string, string> Mapping 
{ 
    get { return map; } 
} 
0

你的意思是這樣的嗎?

readonly Dictionary<string, string> _map = new Dictionary<string, string>(); 

public Dictionary<string, string> Map 
{ 
    get { return _map; } 
} 

爲什麼你讓這個變量爲readonly


如果你想給訪問包含在詞典中,你可以創建一個公開字典的方法中的值,而不讓其修改:

public string GetMapValue(string key) 
{ 
    return _map[key]; 
} 
+0

唯一的問題是內部字典現在可以在外部修改。 – Oded

+0

@Oded:我不認爲只讀對.NET中的Dictionary有相同的效果。它仍然是可變的。 http://stackoverflow.com/questions/678379/is-there-a-read-only-generic-dictionary-available-in-net – 2012-12-12 14:04:05

+0

@ 0A0D - 確實如此,但返回副本仍然可以保持內部字典的安全。你的答案遭受同樣的問題(看起來是相同的...) – Oded

2

您可以定義一個讀 - 僅屬性允許你的領域的公共訪問:

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

public Dictionary<string, string> Map 
{ 
    get { return map; } 
} 

注意,這隻會防止改變分配到實例的引用外部類,而不是改變字典本身的內容。

+1

你可以在.NET 4.5中使用'ReadOnlyDictionary' –

0

你可以寫一個public屬性函數返回private readonly map,e.g:

public Dictionary<string, string> Map { { get { return map; } } } 

然而,Dictionary仍然是可變的。如果您想要只讀Dictionary,請參閱此SO question

2

有人可能會爭辯說,你不應該爲一個班級的私人成員編寫測試。測試應該只使用公共接口,不要依賴類的內部,因爲你應該能夠重構類的內部,而不會破壞任何測試。

如果您添加一個公共getter'僅用於測試',則不能保證有人會開始在項目中的某個地方使用。

如果您確實想要公開字典並使用.NET 4.5,請使用ReadOnlyDictionary類來確保調用者不會更改任何內容。

public IDictionary<string, string> Map 
{ 
    get { return new ReadOnlyDictionary<string, string>(map); } 
}