створення параметрів об'єкта в {}?


15

Я намагаюся розшифрувати фрагмент коду з книги:

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

Особа - це просто простий клас, який вони створили, з купою полів: Ім'я, Прізвище тощо.

Що я не розумію, чи не надсилаємо параметри конструктору 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
Ах, я просвітлений, відмінне пояснення.
Дійсність реальності

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.