Никогда не безопасно принять что-либо.
явная проверка также больше соглашается с тем, что Вы тестируете.
Нет, это не ошибка ... это ошибка в вашем понимании синтаксиса инициализации :)
Идея
Dictionary = { ... }
предназначена для случаев, когда вызывающий имеет доступ для чтения к свойству коллекции, но не имеет доступа для записи . Другими словами, ситуации наподобие этой:
class Test
{
private readonly Dictionary<string, string> dictionary
= new Dictionary<string, string>();
public Dictionary<string, string> Dictionary { get { return dictionary; } }
}
В основном это заканчивается вызовом Add, но без предварительного создания новой коллекции. Итак, этот код:
Test test = new Test { Dictionary = { { "a", "b"}, {"c", "d" } };
эквивалентен:
Test tmp = new Test();
Dictionary<string, string> tmpDictionary = tmp.Dictionary;
tmpDictionary.Add("a", "b");
tmpDictionary.Add("c", "d");
Test test = tmp;
Хорошим примером того, где это полезно, является коллекция Controls
для пользовательского интерфейса. Вы можете сделать это:
Form form = new Form
{
Controls =
{
new Button { Text = "Hi" },
new TextBox { Text = "There" }
}
};
, но вы не могли установить свойство Controls
, потому что оно '
Это не срабатывает с исключением нулевой ссылки, потому что вы объявили переменную ( Dictionary), который не инициализирован, следовательно, имеет значение NULL.
Когда вы пытаетесь добавить в него записи, используя синтаксис инициализатора, вы пытаетесь записать данные в нулевой объект.
Когда вы заменяете строку на " = new Dictionary ... ", вы создаете новый объект для словаря, который будет ссылаться на него, и, следовательно, можете успешно добавлять в него записи.
(В примере Джона Скита коллекция Controls должна быть уже создана Форма, следовательно, работает нормально)