User user1 = new User { Name = "Tom", Age = 33 };
Почему в конструкторе используются фигурные скобки?
Интуиция мне говорит что это связано со свойствами.
Формально выражение создания объекта определяется следующей грамматикой
выражение-создания-объекта:
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
.
Вы можете также использовать в этой конструкции конструктор с параметрами и вполне возможно, что конструктор также инициализирует эти свойства, но их значения в конечном итоге будут переписаны значениями в из инициализатора объекта.
Такая форма удобна при работе со структурами, когда имеется только конструктор по умолчанию, и вы можете в одном предложении вызвать этот конструктор и инициализировать поля структуры, а не писать несколько предложений с отдельными присваиваниями.
В данном случае Вы инициализируете свойства Вашего объекта. В этом нет ничего странного. Если бы Вы написали параметризированный конструктор
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;
Виртуальный выделенный сервер (VDS) становится отличным выбором
Троелсен в своей книге, советует переопределить метод ToString() у класса(переопределенная версия возвращает строку из полей всего класса через...
Допустим, имеется объект с переопределенным GetHashCode, который я хочу сделать ключемGetHashCode вычисляется, как совокупность GetHashCode всех полей
Доброго времени суток, сейчас нахожусь в поисках IMAP клиента, который бы поддерживал работу через прокси и был бесплатнымГугл достаточно...