我在C#中有一个包含字典的类,我想创建它并确保在该字典中添加,编辑或删除任何内容,只要包含它的类存在。
readonly并没有真正的帮助,一旦我测试并看到我之后可以添加项目。例如,我创建了一个例子:
public class DictContainer
{
private readonly Dictionary<int, int> myDictionary;
public DictContainer()
{
myDictionary = GetDictionary();
}
private Dictionary<int, int> GetDictionary()
{
Dictionary<int, int> myDictionary = new Dictionary<int, int>();
myDictionary.Add(1, 2);
myDictionary.Add(2, 4);
myDictionary.Add(3, 6);
return myDictionary;
}
public void Add(int key, int value)
{
myDictionary.Add(key, value);
}
}
我希望Add方法不起作用。如果可能的话,我希望它甚至不能编译。有什么建议吗?
实际上,我很担心代码会让很多人改变。因此,即使我隐藏了Add方法,某人也可能“无辜地”创建一个添加密钥或删除另一个密钥的方法。我希望人们看起来并知道他们不应该以任何方式改变字典。就像我有一个const变量一样。
答案 0 :(得分:12)
.NET Framework中没有任何内容可以帮助您,但是this post在C#中提供了一个非常好的泛型ReadOnlyDictionary
实现。它实现了您可能期望的所有接口(IDictionary
,ICollection
,IEnumerable
等等。作为奖励,整个类及其成员都完全注释了XML。 / p>
(我没有在这里发布代码,因为所有XML注释都非常长。)
答案 1 :(得分:7)
完全隐藏字典。只需在DictContainer类上提供一个get方法,该方法从字典中检索项目。
public class DictContainer
{
private readonly Dictionary<int, int> myDictionary;
public DictContainer()
{
myDictionary = GetDictionary();
}
private Dictionary<int, int> GetDictionary()
{
Dictionary<int, int> myDictionary = new Dictionary<int, int>();
myDictionary.Add(1, 2);
myDictionary.Add(2, 4);
myDictionary.Add(3, 6);
return myDictionary;
}
public this[int key]
{
return myDictionary[key];
}
}
答案 2 :(得分:3)
呃...然后不要定义添加方法...
保持myDictionary
变量私有并公开Getter / Indexer,以便只能从该类外部读取..
想知道他是否完全错过了
答案 3 :(得分:1)
没有内置的方法,请考虑使用a wrapper class.
答案 4 :(得分:0)
interface IReadOnlyDic<Key, Value>
{
void Add(Key key, Value value);
}
class ReadOnlyDic<Key, Value> : Dictionary<Key, Value>, IReadOnlyDic<Key, Value>
{
public new void Add(Key key, Value value)
{
//throw an exception or do nothing
}
#region IReadOnlyDic<Key,Value> Members
void IReadOnlyDic<Key, Value>.Add(Key key, Value value)
{
base.Add(key, value);
}
#endregion
}
添加自定义项目;
IReadOnlyDic<int, int> dict = myDictInstance as IReadOnlyDic<int, int>;
if (dict != null)
dict.Add(1, 155);
答案 5 :(得分:0)
这是另一种方式
class ReadOnlyDic<Key, Value> : Dictionary<Key, Value>
{
private bool _locked = false;
public new void Add(Key key, Value value)
{
if (!_locked)
{
base.Add(key, value);
}
else
{
throw new ReadOnlyException();
}
}
public void Lock()
{
_locked = true;
}
}
答案 6 :(得分:0)
我喜欢来自link的bruno-conde,这是一个比较简单的Noldorin,但是一旦我无法将他的评论标记为答案,我会将{{3}}的答案标记为官方因为它是一个类似且令人满意的答案。
太糟糕了,没有办法阻止代码编译:(。谢谢,伙计们
答案 7 :(得分:0)
这是一个更好的选择,正如我在以下所描述的那样:
http://www.softwarerockstar.com/2010/10/ ..
本质上,它是一个更简单的解决方案子类化ReadOnlyCollection,它以更优雅的方式完成工作。
答案 8 :(得分:0)
仅供参考,现在内置于.net 4.5。
http://msdn.microsoft.com/en-us/library/gg712875(v=vs.110).aspx