我有一個IDictionary<string, MyEnum?>
集合需要傳遞給一個類來包裝它在IReadOnlyDictionary<string, MyEnum>
(注意MyEnum
但不是MyEnum?
)。只讀集合屬性的類設計
我想出了兩種設計:
延遲包裝到
IReadOnlyDictionary<string, MyEnum>
直到屬性訪問:public class MyClass { private readonly IEnumerable<KeyValuePair<string, MyEnum?>> _kvps; public MyClass(IEnumerable<KeyValuePair<string, MyEnum?>> kvps) { _kvps = kvps; } public IReadOnlyDictionary<string, MyEnum> Kvps { get { var filtered = from kvp in _kvps where kvp.Value.HasValue select kvp; return new ReadOnlyDictionary<string, MyEnum>( filtered.ToDictionary(kvp => kvp.Key, kvp => (MyEnum)kvp.Value); } } }
在構造
public class MyClass { public MyClass(IEnumerable<KeyValuePair<string, MyEnum?>> kvps) { Kvps = ToReadOnly(kvps); } public IReadOnlyDictionary<string, MyEnum> Kvps { get; } private static IReadOnlyDictionary<string, MyEnum> ToReadOnly( IEnumerable<KeyValuePair<string, MyEnum?>> kvps) { var filtered = from kvp in kvps where kvp.Value.HasValue select kvp; return new ReadOnlyDictionary<string, MyEnum>( filtered.ToDictionary(kvp => kvp.Key, kvp => (MyEnum)kvp.Value); } }
「框架設計指南」中的constructor design部分指出,最小的工作應該在構造函數中完成,所以我選擇第一種方法。但是,這意味着每次致電MyClass.Kvps
都會觸發_kvps
這個不理想的副本。
我想知道這是一個更好的方法(或有其他方式)在以下方面:
- 記憶效率(理想情況下只集合的一個副本存儲在
MyClass
) - 性能(屬性訪問要快而不應觸發
KeyValuePair
s的複印件)
如果源字典在構造和屬性訪問之間或連續屬性訪問之間被修改,那麼您的兩個設計具有不同的行爲。你要哪個? – Blorgbeard
@Blorgbeard我想要屬性總是反映源'IDictionary'的最新值。這是否意味着我僅限於我的第一種方法? – rexcfnghk
然後是的,你必須在屬性訪問器中進行過濾。 – Blorgbeard