我在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的。它实现了所有的接口,你可以指望它(IDictionaryICollectionIEnumerable等),作为奖金,整个类及其成员与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;
    }
}

我喜欢的链路通过布鲁诺 - 孔德,这是一个简单的办法,但一旦我不能标记为答案他的评论,我会庆祝 Noldorin 答案的官员,因为这是一个类似的和令人满意的答案。

太糟糕了,有没有以防止代码编译:(一种方式。谢谢,伙计们

下面是如我在描述一个更好的选择:

http://www.softwarerockstar.com/2010/10/ ..

本质上讲,它是一个更简单的解决方案子类ReadOnlyCollection,它得到一个更优雅的方式做的工作。

仅供参考,现在它是内置到.NET 4.5。

http://msdn.microsoft.com /en-us/library/gg712875(v=vs.110).aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top