словарь const на языке c#
У меня есть класс В 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 ответов
нет ничего в .NET Framework, чтобы помочь вам здесь, но этот пост дает довольно хорошую реализацию generic ReadOnlyDictionary в C#. Он реализует все интерфейсы, которые вы могли бы ожидать (IDictionary, ICollection, IEnumerable, etc.) и в качестве бонуса весь класс и его члены полностью комментируются с помощью XML.
(я воздержался от публикации кода здесь, потому что он действительно довольно длинный со всеми комментариями XML.)
полностью скрыть словарь. Просто укажите метод get в классе DictContainer, который извлекает элементы из словаря.
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];
    }
}
да... затем не определяйте метод Add...
сохранить myDictionary переменная private и предоставляет Геттер / индексатор, чтобы его можно было читать только извне этого класса..
интересно, если он полностью пропустил точку
нет встроенного способа сделать это, подумайте об использовании класс-оболочку.
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;
    }
}
Мне понравилось ссылке С Бруно-Конде, что было проще, но как только я не могу отметить его комментарий как ответ, я отмечу Нольдорцы ответ как официальный, ибо это аналогичный и удовлетворительный ответ.
слишком плохо, что нет способа предотвратить компиляцию кода : (. Спасибо, ребята!--7-->
вот лучшая альтернатива, как я описал в:
http://www.softwarerockstar.com/2010/10/..
по сути, это гораздо более простое решение подкласса ReadOnlyCollection, которое получает работу в более элегантной манере.
FYI, теперь он встроен в .net 4.5.
http://msdn.microsoft.com/en-us/library/gg712875 (v=против 110).aspx
