Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Странный конструктор

#c_sharp #конструктор


User user1 = new User { Name = "Tom", Age = 33 };


Почему в конструкторе используются фигурные скобки?

Интуиция мне говорит что это связано со свойствами. 
    


Ответы

Ответ 1



Формально выражение создания объекта определяется следующей грамматикой выражение-создания-объекта: new тип ( список аргументов ) инициализатор-объекта new тип инициализатор объекта где инициализатор объекта в свою очередь определяется как Инициализатор-объекта: { список-инициализаторов-элементов } То есть в этом предложении User user1 = new User { Name = "Tom", Age = 33 }; выполняются две вещи. Первое - это вызывается конструктор по умолчанию, а затем свойствам Name и Age в инициализаторе объекта присваиваются значения. Эта строка аналогична следующему коду: User user1 = new User(); user1.Name = "Tom"; user1.Age = 33; При этом свойства Name И Age должны быть доступны, например, объявлены с модификатором public. Вы можете также использовать в этой конструкции конструктор с параметрами и вполне возможно, что конструктор также инициализирует эти свойства, но их значения в конечном итоге будут переписаны значениями в из инициализатора объекта. Такая форма удобна при работе со структурами, когда имеется только конструктор по умолчанию, и вы можете в одном предложении вызвать этот конструктор и инициализировать поля структуры, а не писать несколько предложений с отдельными присваиваниями.

Ответ 2



В данном случае Вы инициализируете свойства Вашего объекта. В этом нет ничего странного. Если бы Вы написали параметризированный конструктор User(string name, int age) { Name = name; Age = age; } И вызвали его при создании экземпляра класса User user1 = new User("Tom", 33); То результат был бы идентичным, инициализация свойств Name и Age. Но в них есть некоторые отличия. При использовании инициализатора { } и конструктора по умолчанию (Можно вызывать любой конструктор, но в большинстве случаев в этом нет необходимости) - в свойствах будут записаны те значения, которые объявлялись в инициализаторе. User user1 = new User(){ Name = "Vasilii", Age = 45 }; Так происходит потому что значения описанные в инициализаторе присваиваются после вызова конструктора. Или же это делается для простоты понимания Вашего кода. Ведь согласитесь, что такой код User user1 = new User { Name = "Tom", Age = 33 }; выглядит лучше и компактнее, чем User user1 = new User(); user1.Name = "Tom"; user1.Age = 33;

Комментариев нет:

Отправить комментарий