Разве эта хеш-таблица не должна быть доступна только для чтения? - PullRequest
0 голосов
/ 29 сентября 2011

У меня есть класс, который имеет функцию получения для хеш-таблицы с именем _Parameters.

private Hashtable _Parameters = new Hashtable();
public Hashtable Parameters { get { return _Parameters; } }

_Parameters нигде не упоминается в коде. Теперь, поскольку нет функции setter, я думаю, что ничто за пределами этого класса не может изменить то, что хранилось в _Parameters, только прочитать его. Однако это не так. Другой класс вызывает этот код (где template является экземпляром класса, упомянутого выше)

template.Parameters[key] = parameters[key];

Это приводит к изменению _Parameters. Как это возможно? Применяются ли сеттеры только в том случае, если мы назначаем вейлы с '='?

Ответы [ 5 ]

5 голосов
/ 29 сентября 2011

Нет.Вы возвращаете ссылку, которую можно изменить.Но вы не можете переопределить саму ссылку.

Попробуйте вместо этого использовать ReadOnlyDictionary<TKey, TValue>.

Рассмотрите возможность чтения Неизменяемых объектов ,Это должно объяснить вам предмет.

3 голосов
/ 29 сентября 2011

Существует разница между изменением объекта HashTable или изменением содержимого HashTable.

Отсутствие сеттера гарантирует, что никто не сможет:

  • установить HashTable в NULL
  • изменить ссылку на HashTable на другую HashTable.

Однако содержимое HashTable можно изменить.

2 голосов
/ 29 сентября 2011

Вы можете получить доступ к методам Hashtable, вы просто не можете установить для него новое значение (например, NULL или новый экземпляр Hashtable).

Например, если у меня есть Список строк и Свойство с геттером, но без сеттера, я могу добавить в список, удалить из списка, вызвать метод Clear (), чтобы очистить список ... но Я не могу сделать myList = null (или myList = new List ()), потому что нет установщика.

Я получаю ссылку на объект, что позволяет мне манипулировать им, но без установщика я не могу установить ссылку на новый объект.

1 голос
/ 29 сентября 2011

Наличие свойства только для чтения для объекта класса (в отличие от структуры) только предотвращает изменение значения свойства, в данном случае ссылки на объект.Однако, когда вы получаете доступ к свойству, вы получаете ссылку на ваш внутренний объект HashTable, и вы можете свободно вызывать любой открытый метод возвращаемого объекта HashTable, включая добавление и удаление записей в HashTable.Это свойство, предназначенное только для чтения, не позволяет вызывающей стороне заменить ваш объект HashTable совершенно другим объектом HashTable.

1 голос
/ 29 сентября 2011

Когда вы возвращаете _Parameters, вы не возвращаете совершенно новый Hashtable. Вы возвращаете другую ссылку на тот же. Этот объект, являющийся ссылкой на тот же объект, имеет полный интерфейс Hashtable, который можно использовать, включая вещи, которые его модифицируют. Отсутствие сеттера мешает вам заменить прежний _Parameters новым Hashtable

...