代码之家  ›  专栏  ›  技术社区  ›  Samuel Carrijo

c语言中的常量词典#

  •  8
  • Samuel Carrijo  · 技术社区  · 15 年前

    我有一个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方法,也有可能有人“天真地”创建一个添加键或删除另一个键的方法。我想让人们看看,知道他们不应该以任何方式修改字典。就像我使用常量变量一样。

    9 回复  |  直到 15 年前
        1
  •  12
  •   Steven    10 年前

    在.NET框架中没有任何东西可以帮助您,但是 this post ReadOnlyDictionary 在C#中。它实现了您可能期望它实现的所有接口( IDictionary ICollection , IEnumerable 作为奖励,整个类及其成员都使用XML进行了完整的注释。

    (我没有在这里发布代码,因为包含所有XML注释的代码非常长。)

        2
  •  8
  •   Neil Barnwell    15 年前

    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];
        }
    }
    
        3
  •  3
  •   Eoin Campbell    15 年前

    嗯。。。然后不要定义Add方法。。。

    保留 myDictionary 变量private并公开Getter/Indexer,以便只能从该类外部读取它。。

        4
  •  1
  •   Steven    10 年前

    没有内置的方式,考虑使用 a wrapper class.

        5
  •  0
  •   Tolgahan Albayrak    15 年前
    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);
    
        6
  •  0
  •   Tolgahan Albayrak    15 年前

    这是另一种方式

    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;
        }
    }
    
        7
  •  0
  •   Community rohancragg    7 年前

    link 从…起 bruno-conde ,这是一个更简单的问题,但一旦我不能将他的评论作为答案,我会做标记 Noldorin

    可惜没有办法阻止代码编译:(.谢谢,伙计们

        8
  •  0
  •   SoftwareRockstar    14 年前

    这里有一个更好的选择,正如我在以下网站中所描述的:

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

    本质上,它是一个简单得多的解决方案,将ReadOnlyCollection子类化,以更优雅的方式完成工作。

        9
  •  0
  •   batbaatar    10 年前

    仅供参考,现在它内置于.net 4.5中。

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