-
21-08-2019 - |
题
我在C#的一类,其中包含一个字典,其中我想创建并确保没有如添加,编辑或删除从该词典,只要其含有它存在的类。
只读并不能真正帮助,一旦我测试,看见我后可以添加项目。只是举例来说,我创建的示例:
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变量。
解决方案
有什么在.NET Framework来帮助你在这里,但的这个帖子给出了一个相当不错的实现在C#泛型ReadOnlyDictionary
的。它实现了所有的接口,你可以指望它(IDictionary
,ICollection
,IEnumerable
等),作为奖金,整个类及其成员与XML完全注释。
(我从这里发布的代码忍住了,因为它真的很长,所有的XML注释。)
其他提示
隐藏字典完全。只是提供关于从词典中检索项目类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];
}
}
呃...那就不要定义添加方法...
请的myDictionary
可变私人和暴露的吸气剂/索引使得它只能从类外部..
想知道,如果他完全错过了点的
有没有内置的方式做到这一点,可以考虑使用一包装类。
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);
,这是另一种方式
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;
}
}
下面是如我在描述一个更好的选择:
http://www.softwarerockstar.com/2010/10/ ..
本质上讲,它是一个更简单的解决方案子类ReadOnlyCollection,它得到一个更优雅的方式做的工作。
仅供参考,现在它是内置到.NET 4.5。
http://msdn.microsoft.com /en-us/library/gg712875(v=vs.110).aspx