C# c语言中的常量词典#
我有一个C#中的类,其中包含一个字典,我希望创建该字典,并确保只要包含它的类存在,就不会添加、编辑或从该字典中删除任何内容 readonly并没有真正的帮助,一旦我测试并发现我可以在之后添加项目。例如,我创建了一个示例:C# c语言中的常量词典#,c#,.net,dictionary,immutability,readonly,C#,.net,Dictionary,Immutability,Readonly,我有一个C#中的类,其中包含一个字典,我希望创建该字典,并确保只要包含它的类存在,就不会添加、编辑或从该字典中删除任何内容 readonly并没有真正的帮助,一旦我测试并发现我可以在之后添加项目。例如,我创建了一个示例: public class DictContainer { private readonly Dictionary<int, int> myDictionary; public DictContainer() { myDict
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);
}
}
公共类容器
{
私人只读词典;
公共容器()
{
myDictionary=GetDictionary();
}
私有字典GetDictionary()
{
Dictionary myDictionary=新字典();
myDictionary.Add(1,2);
myDictionary.Add(2,4);
myDictionary.Add(3,6);
返回myDictionary;
}
公共void Add(int键,int值)
{
添加(键、值);
}
}
我希望Add方法不起作用。如果可能的话,我希望它甚至不编译。有什么建议吗
事实上,我担心的是,很多人都可以修改代码。因此,即使我隐藏Add方法,也有可能有人“天真地”创建一个添加键或删除另一个键的方法。我想让人们看看,知道他们不应该以任何方式修改字典。就像我使用常量变量一样。呃。。。然后不要定义Add方法 将
myDictionary
变量保持私有,并公开Getter/Indexer,以便只能从该类之外读取它
不知道他是否完全没有抓住要点把字典完全藏起来。只需在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=GetDictionary();
}
私有字典GetDictionary()
{
Dictionary myDictionary=新字典();
myDictionary.Add(1,2);
myDictionary.Add(2,4);
myDictionary.Add(3,6);
返回myDictionary;
}
公开此[int-key]
{
返回myDictionary[key];
}
}
< /代码> 没有内置的方法,考虑使用 在.NETFramework中没有什么可以帮助您,但是在C语言中给出了一个很好的实现了一个通用的<代码> RealDyListBoo> <代码>。它实现了您可能期望它实现的所有接口(IDictionary
,ICollection
,IEnumerable
,等等),另外,整个类及其成员都使用XML进行了完整的注释
(我没有在这里发布代码,因为所有的XML注释都很长。)interface-IReadOnlyDic
{
无效添加(键、值);
}
类ReadOnlyDic:Dictionary,IReadOnlyDic
{
公共新空添加(键、值)
{
//抛出异常或不执行任何操作
}
#区域IReadOnlyDic成员
void IReadOnlyDic.Add(键、值)
{
添加(键、值);
}
#端区
}
添加自定义项目
IReadOnlyDic<int, int> dict = myDictInstance as IReadOnlyDic<int, int>;
if (dict != null)
dict.Add(1, 155);
IReadOnlyDic dict=作为IReadOnlyDic的MyDictionInstance;
if(dict!=null)
新增(1155条);
这是另一种方式
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;
}
}
class ReadOnlyDic:Dictionary
{
私有布尔锁定=假;
公共新空添加(键、值)
{
如果(!\u已锁定)
{
添加(键、值);
}
其他的
{
抛出新的ReadOnlyException();
}
}
公共无效锁()
{
_锁定=真;
}
}
我喜欢from,这是一个更简单的答案,但一旦我不能将他的评论标记为答案,我会将答案标记为官方答案,因为这是一个类似且令人满意的答案
太糟糕了,没有办法阻止代码编译:(.谢谢,伙计们这里有一个更好的选择,正如我在以下网站中所描述的:
从本质上讲,它是一个简单得多的解决方案,将ReadOnlyCollection子类化,以更优雅的方式完成工作。FYI,现在它内置于.net 4.5中
奇怪的需求表明您的设计存在问题。您可能希望重新思考您在此处尝试的内容。否则,您可以轻松创建自己的实现来实现此功能。您可以实现自己的字典。类似问题:+1表示“不在此处发布代码”!链接到原始源代码总是更好;类似于赞扬作者。@Cerburus:是的,应该首先链接到原始源代码-正如你所说,最好将其归因于作者。我的意见是,如果代码/文本足够短,通常在此处镜像它会很有帮助(例如,万一网站崩溃),但这在本例中并不太合适。感谢您参考我的文章:-)。+1,因为解决方案简单,并且与字典的接口兼容。但是:为什么使用“新建”而不是“覆盖”?此外,除了Add之外,Remove方法也应该被覆盖。@chiccodoro:Dictionary
没有virtual
方法。
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;
}
}