Erstellen von Objektparametern in {}?

14

Ich versuche, ein Stück Code aus einem Buch zu entschlüsseln:

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

Person ist nur eine einfache Klasse, die sie gemacht haben, mit einer Reihe von Feldern: Name, Nachname, etc ...

Was ich nicht verstehe, ist, senden wir nicht Parameter in nicht geschweiften Klammern an einen Konstruktor von Person? Ich habe versucht, diesen Code zu replizieren, aber er scheint nicht zu funktionieren.

Danke für die Eingabe.

RealityDysfunction
quelle
1
"Ich habe versucht, diesen Code zu replizieren, aber er scheint nicht zu funktionieren" <- Sie müssen C # 3 (VS 2008) oder höher verwenden, damit diese Syntax verfügbar ist.
AakashM
Beachten Sie die Unterschiede zwischen den beiden Konzepten: Objektinitialisierung und Objektauffüllung. Im Allgemeinen führen Sie die Initialisierung im Konstruktor durch. Die Methode Ihres Beispiels eignet sich am besten für Populationen, nicht für Initialisierungen.
NoChance

Antworten:

27

Mit C # können Sie Eigenschaftsparameter in geschweiften Klammern angeben, wenn das Objekt initialisiert wird. Auf diese Weise können Sie auswählen, welche Elemente initialisiert und welche als Standardeinstellungen beibehalten werden sollen.

Ein Konstruktor führt dagegen einen einzelnen Codeblock mit einem festen Satz von Parametern aus. Um den gleichen Effekt zu erzielen, müssten Sie mehrere Konstruktoren mit den verschiedenen Kombinationen von Eigenschaften erstellen, die Sie möglicherweise initialisieren möchten. Dies kann mühsam sein.

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

ist genau gleichbedeutend mit:

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

Abgesehen davon, dass es kürzer ist und die Augen besser schont.

Es können auch Konstrukte verwendet werden, wie Sie in Ihrer Frage gezeigt haben. Dies wäre sehr mühsam, wenn Sie temporäre Variablen erstellen und wie hier beschrieben initialisieren müssten, bevor Sie sie zur Liste hinzufügen. (So ​​mussten Sie es früher tun.) Alles ohne einen explizit definierten Konstruktor, der die gewünschte Liste von Parametern aufnimmt, die möglicherweise verfügbar sind oder nicht.

Beachten Sie auch, dass ein Konstruktor zwar Eigenschaften mit einem privaten Setter initialisieren kann, diese Technik (wie aus dem bereitgestellten Beispiel ersichtlich sein sollte) jedoch nur funktioniert, wenn Sie einen öffentlichen Setter für die Eigenschaft haben. Beachten Sie auch, dass mein verkürztes Beispiel implizit den Standardkonstruktor (ohne Parameter) nennt, der daher vorhanden sein müsste.

tylerl
quelle
Könnte es wert sein, hinzugefügt zu werden, dass aus diesem Grund die Eigenschaften, die in geschweiften Klammern initialisiert werden, öffentlich einstellbar sein müssen.
Yam Marcovic
@ YamMarcovic ah. Ja. Note hinzugefügt, um diesen Effekt.
Tylerl
2
Ah, ich bin erleuchtet, ausgezeichnete Erklärung.
RealityDysfunction
2
Um einen sehr ähnlichen Effekt mit einem einzigen Konstruktor zu erzielen, können Sie alle Parameter optional festlegen. Dann könnten Sie etwas tun , wie new Person(lastName: "Simpson"), die das Weglassen firstNameund ageParameter.
Svick
Dies spricht nicht an, warum Sie diese nicht einfach an den Konstruktor weitergeben können, dhvar x = new Person("Homer", "Simpson", 47);
rayray