создание параметров объекта в {}?


14

Я пытаюсь декодировать кусок кода из книги:

List<Person> people = new List<Person>()
{
new Person {FirstName="Homer",LastName="Simpson",Age=47},
new Person {FirstName="Marge",LastName="Simpson",Age=45}
};

Person - это просто простой класс, который они создали, с кучей полей: Имя, Фамилия и т. Д.

Чего я не понимаю, так это разве мы не посылаем параметры конструктору Person в не фигурных скобках? Я пытался воспроизвести этот код, но он, похоже, не работает

Спасибо за вклад.



1
«Я пытался реплицировать этот код, но он, похоже, не работает» <- вам нужно использовать C # 3 (VS 2008) или новее, чтобы этот синтаксис был доступен.
AakashM

Помните о различиях между двумя понятиями: инициализация объекта и заполнение объекта. В общем, вы делаете инициализацию в конструкторе. Метод вашего примера лучше всего использовать для населения, а не для инициализации.
NoChance

Ответы:


27

C # позволяет указывать параметры свойств в фигурных скобках при инициализации объекта. Это позволяет вам выбирать, какие элементы инициализировать, а какие оставить по умолчанию.

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

var x = new Person {FirstName="Homer",LastName="Simpson",Age=47}; 

в точности эквивалентно этому:

var x = new Person();
x.FirstName="Homer";
x.LastName="Simpson";
x.Age=47;

За исключением того, что это короче и, возможно, легче для глаз.

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

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


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

@YamMarcovic ах. да. Примечание добавлено к этому эффекту.
Tylerl

2
Ах, я просветленный, отличное объяснение.
RealityDysfunction

2
Чтобы получить очень похожий эффект с одним конструктором, вы можете сделать все его параметры необязательными. Тогда вы могли бы сделать что - то подобное new Person(lastName: "Simpson"), в результате чего вне firstNameи ageпараметров.
svick

Это не относится к тому, почему вы не можете просто передать их конструктору, то естьvar x = new Person("Homer", "Simpson", 47);
Rayray
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.