Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c语言中的常量词典#_C#_.net_Dictionary_Immutability_Readonly - Fatal编程技术网

C# c语言中的常量词典#

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

我有一个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);
    }

}
公共类容器
{
私人只读词典;
公共容器()
{
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;
    }
}