creazione di parametri oggetto in {}?


14

Sto cercando di decodificare un pezzo di codice da un libro:

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

La persona è solo una semplice classe che hanno creato, con un sacco di campi: Nome, Cognome, ecc ...

Quello che non capisco è, non inviamo parametri a un costruttore di Person tra parentesi graffe? Ho provato a replicare questo codice, ma non sembra volare, nessun acquirente?

Grazie per l'input.



1
"Ho provato a replicare questo codice, ma non sembra volare" <- è necessario utilizzare C # 3 (VS 2008) o versione successiva per rendere disponibile questa sintassi.
AakashM,

Essere consapevoli delle differenze tra i due concetti: inizializzazione dell'oggetto e popolazione dell'oggetto. In generale si esegue l'inizializzazione nel costruttore. Il metodo del tuo esempio è meglio usato per popolazione non per inizializzazione.
NoChance,

Risposte:


27

C # consente di specificare i parametri delle proprietà tra parentesi graffe quando l'oggetto viene inizializzato. Ciò consente di scegliere quali elementi inizializzare e quali lasciare come predefiniti.

Un costruttore, d'altra parte, esegue un singolo blocco di codice con un set fisso di parametri. Quindi per ottenere lo stesso effetto dovresti creare più costruttori tutti con le varie combinazioni di proprietà che potresti voler inizializzare, il che potrebbe essere noioso.

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

è esattamente equivalente a questo:

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

Solo che è più corto e probabilmente più facile per gli occhi.

Permette anche costrutti come hai dimostrato nella tua domanda, il che sarebbe molto noioso se dovessi creare variabili temporanee e inizializzarle come ho fatto qui prima di aggiungerle all'elenco. (È così che dovevi farlo.) Il tutto senza richiedere un costruttore esplicitamente definito che prenda l'elenco di parametri desiderato, che può essere o non essere disponibile.

Inoltre, nota che mentre un costruttore può inizializzare le proprietà con un setter privato, questa tecnica (come dovrebbe essere ovvio dall'esempio fornito) funzionerà solo se hai un setter pubblico per la proprietà. Nota anche che il mio esempio abbreviato ha implicitamente chiamato il costruttore predefinito (senza parametri), che quindi dovrebbe essere presente.


Potrebbe valere la pena aggiungere che, a causa di ciò, le proprietà inizializzate tra parentesi graffe devono essere impostabili pubblicamente.
Yam Marcovic,

@YamMarcovic ah. sì. Nota aggiunta a tale effetto.
tylerl,

2
Ah, sono illuminato, eccellente spiegazione.
RealityDysfunction

2
Per ottenere un effetto molto simile con un singolo costruttore, è possibile rendere facoltativi tutti i suoi parametri. Quindi potresti fare qualcosa del genere new Person(lastName: "Simpson"), tralasciando i parametri firstNamee age.
svick,

Questo non spiega perché non puoi semplicemente passare quelli al costruttore, cioèvar x = new Person("Homer", "Simpson", 47);
rayray
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.