c#中的const词典

时间:2009-05-12 16:51:40

标签: c# .net dictionary immutability readonly

我在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变量一样。

9 个答案:

答案 0 :(得分:12)

.NET Framework中没有任何内容可以帮助您,但是this post在C#中提供了一个非常好的泛型ReadOnlyDictionary实现。它实现了您可能期望的所有接口(IDictionaryICollectionIEnumerable等等。作为奖励,整个类及其成员都完全注释了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)

我喜欢来自linkbruno-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