tworzysz parametry obiektu w {}?

15

Próbuję odkodować fragment kodu z książki:

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

Osoba jest tylko prostą klasą, którą stworzyli, z wieloma polami: Imię, Nazwisko itp.

Nie rozumiem, czy nie wysyłamy parametrów do konstruktora Person w nawiasach klamrowych? Próbowałem replikować ten kod, ale wydaje się, że nie lata, jacyś chętni?

Dzięki za wkład.

Rzeczywistość Dysfunkcja
źródło
1
„Próbowałem replikować ten kod, ale nie wydaje się on latać” <- musisz użyć C # 3 (VS 2008) lub nowszej, aby ta składnia była dostępna.
AakashM
Należy pamiętać o różnicach między tymi dwiema koncepcjami: inicjowaniem obiektu i populacją obiektu. Zasadniczo inicjowanie odbywa się w konstruktorze. Metodę z twojego przykładu najlepiej zastosować do populacji, a nie do inicjalizacji.
NoChance,

Odpowiedzi:

27

C # pozwala określić parametry właściwości w nawiasach klamrowych podczas inicjalizacji obiektu. Pozwala to wybrać i wybrać, które elementy należy zainicjować, a które pozostawić jako domyślne.

Konstruktor natomiast uruchamia jeden blok kodu ze stałym zestawem parametrów. Aby uzyskać ten sam efekt, musisz utworzyć wiele konstruktorów, wszystkie z różnymi kombinacjami właściwości, które możesz chcieć zainicjować, co może być uciążliwe.

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

jest dokładnie równoważne z tym:

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

Tyle że jest krótszy i prawdopodobnie łatwiejszy dla oczu.

Pozwala również na konstrukcje takie jak zademonstrowane w pytaniu, co byłoby bardzo uciążliwe, gdybyś musiał utworzyć zmienne tymczasowe i zainicjować je, tak jak ja tutaj, przed dodaniem ich do listy. (Tak właśnie to robiłeś). Wszystko to bez wymagania wyraźnie zdefiniowanego konstruktora, który pobiera pożądaną listę parametrów, które mogą być niedostępne.

Zauważ też, że chociaż konstruktor może inicjować właściwości za pomocą prywatnego setera, ta technika (jak powinno być oczywiste z podanego przykładu) będzie działać tylko wtedy, gdy masz publiczny seter dla tej właściwości. Zauważ też, że mój skrócony przykład domyślnie nazywał domyślnego (bez parametrów) konstruktora, który musiałby zatem być obecny.

tylerl
źródło
Warto dodać, że z tego powodu właściwości zainicjowane w nawiasach klamrowych muszą być publicznie ustawiane.
Yam Marcovic
@YMMarcovic ah. tak. Uwaga dodana do tego efektu.
tylerl
2
Ach, jestem oświecony, doskonałe wyjaśnienie.
RealityDysfunction
2
Aby uzyskać bardzo podobny efekt z jednym konstruktorem, możesz ustawić wszystkie jego parametry jako opcjonalne. Następnie możesz zrobić coś takiego new Person(lastName: "Simpson"), pomijając parametry firstNamei age.
svick
Nie dotyczy to powodu, dla którego nie można po prostu przekazać ich konstruktorowi, tj.var x = new Person("Homer", "Simpson", 47);
rayray