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

426
04 февраля 2017, 07:06
User user1 = new User { Name = "Tom", Age = 33 };

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

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

Answer 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.

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

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

Answer 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;
READ ALSO
Переопределение GetHashCode

Переопределение GetHashCode

Троелсен в своей книге, советует переопределить метод ToString() у класса(переопределенная версия возвращает строку из полей всего класса через...

467
Dictionary ключем которого является объект

Dictionary ключем которого является объект

Допустим, имеется объект с переопределенным GetHashCode, который я хочу сделать ключемGetHashCode вычисляется, как совокупность GetHashCode всех полей

403
Нужно получить на c# исходный текст html страницы

Нужно получить на c# исходный текст html страницы

И на самом то деле задачка проста!

590
Клиент IMAP работающий через прокси

Клиент IMAP работающий через прокси

Доброго времени суток, сейчас нахожусь в поисках IMAP клиента, который бы поддерживал работу через прокси и был бесплатнымГугл достаточно...

491