Теоретически инициализаторы места хранения должны создавать новые объекты с заданным состоянием, а не заставлять объекты проходить через ряд состояний. Код, который должен что-то вводить через ряд состояний, должен быть написан в конструкторе объекта.
Инициализация места хранения (поля, переменной и т. Д.) Константой просто устанавливает его значение один раз. Инициализация переменной с помощью конструктора или вызова метода приведет к тому, что методу будет дано все, что ему нужно, до его запуска, но он ничего не изменит с переменной, пока метод не вернется. Таким образом, это также позволяет избежать любой явной последовательности состояний.
Инициализаторы свойств и инициализаторы коллекций нарушают этот шаблон, но работают в предположении, что многие классы спроектированы таким образом, что создание объекта и установка некоторых свойств перед раскрытием ссылки на внешний код приведет к результатам, неотличимым от объекта, мгновенно возникающего в результате существования. с этими свойствами. Аналогично, инициализаторы коллекции предполагают, что создание коллекции и последующий вызов Add
с последовательностью элементов приведут к результатам, неотличимым от появления коллекции, содержащей правильные значения.
Не все классы, которые предоставляют свойства, приведут к ожидаемому поведению при использовании с инициализаторами свойств, и не все классы выглядят как коллекции, которые будут давать ожидаемое поведение при использовании с инициализаторами коллекций, но компилятор готов «угадать» те классы, которые использование с инициализаторами свойств будет соответствовать обычному шаблону свойств, а также для классов, которые используются с инициализаторами коллекций.
Если для настройки объекта потребуются как вызывающие установщики свойств, так и метод item-Add, это будет означать, что объект не является типичными объектами с установщиками свойств и не является типичной коллекцией. Не будет особой причины для того, чтобы язык диктовал, что установщики свойств будут вызываться до добавления элементов, и не будет особой причины указывать, что они будут вызываться после. Можно было бы позволить исходному коду C # для инициализаторов указать порядок, в котором они выполняются, но такая спецификация явно признала бы, что последовательность операций будет влиять на состояние объекта способами, не выраженными в самом инициализаторе. Такие побочные эффекты подразумевают, что рассматриваемый код принадлежит конструктору, а не инициализатору поля.