creazione dei parametri oggetto in {}?

11

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 una serie di campi: Nome, Cognome, ecc.

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

Grazie per l'input.

    
posta RealityDysfunction 29.10.2012 - 06:26
fonte

1 risposta

24

C # consente di specificare i parametri di proprietà nelle parentesi graffe quando l'oggetto viene inizializzato. Questo ti permette di scegliere quali elementi da 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 con tutte 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;

Tranne 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 alla lista. (Questo è il modo in cui dovevi farlo). Tutto senza richiedere un costruttore esplicitamente definito che raccolga l'elenco di parametri desiderato, che può essere o non essere disponibile.

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

    
risposta data 29.10.2012 - 06:37
fonte

Leggi altre domande sui tag