C # Почему в словаре разрешено устанавливать свойства, хотя это внутреннее свойство - PullRequest
0 голосов
/ 11 июня 2018

Я использую свободный API проверки для написания проверок.

Я обнаружил свойство internal set в классе ValidationContext.

public class ValidationContext {
        public Dictionary<string, object> RootContextData { get; internal set; } = new Dictionary<string, object>();
}

Я обнаружил свойство внутреннего набора в этом вопросе .Таким образом, я могу установить значение словаря следующим образом:

var rowItemContext = new ValidationContext();
rowItemContext.RootContextData.Add("ab", new object());//this works

Приведенный выше код для добавления элемента в RootcontextData работает.

Но следующая строка для прямого назначения другого словаряв RootContextData приводит к ошибке времени компиляции.

Свойство или индексатор 'ValidationContext.RootContextData' нельзя назначить - оно доступно только для чтения

rowItemContext.RootContextData = new Dictionary<string, object>()
            {
                { "ab", new object() }
            };

Итак,чтобы добавить словарь элементов к данным контекста, я должен зациклить словарь, чтобы добавить.Я с удивлением вижу, почему первый работает, но не прямое назначение.

Ответы [ 2 ]

0 голосов
/ 18 июня 2018

Есть несколько моментов:

  1. Вы используете внутренний набор, поэтому вы можете устанавливать свойства только внутри вашей сборки.см. также: Что такое свойство внутреннего набора в c #?
  2. Во втором случае вы используете Инициализатор коллекции .Он устанавливает свойство с новым значением (новый словарь, инициализированный с ключом "ab" и значением new object())
  3. Если вы получаете такое исключение, вы пытаетесь сделать это вне вашей сборки.Используйте метод Add.
  4. С точки зрения дизайна: не используйте открытые свойства, которые могут изменить внутреннее состояние вашего объекта.Инкапсулируйте это.
0 голосов
/ 11 июня 2018

Похоже, вы запутались в том, что считается "установкой" свойства.

Как правило, вы только set указываете свойство, когда используете знак =.Когда вы используете оператор присваивания, вы фактически присваивает свойству новое значение.

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

Когда вы вызываете Add, вы просто изменяете объект словаря, а не значение свойства.Значение свойства по-прежнему указывает на тот же объект словаря, поэтому оно остается неизменным.

Когда вы используете = и создаете новый словарь, вы пытаетесь изменить ссылку, сохраненную в свойстве, на другую ссылку.Это считается как 1016 * свойство, так что вы не можете сделать это.

...