2013-01-20 6 views
5

Manchmal ist eine Initialisiererliste nach dem Klassennamen angegeben, ohne den Operator():C# Initializer-Liste - wann() Operator nach Klassenname zu verwenden?

Cat cat = new Cat { Age = 10, Name = "Fluffy" } 

Andere Zeiten festgelegt, nach dem Operator():

List<Cat> cats = new List<Cat> 
    { 
     new Cat(){ Name = "Sylvester", Age=8 } 
    } 

ich die Differenz gehe davon ist denn hier ist der neue Cat() in der Liste. Aber ich verstehe immer noch nicht, warum es anders sein sollte. Warum also der Unterschied und wann welche Syntax verwenden?

Danke.

+0

mögliche Duplikate von [Warum sind C# 3.0 Objektinitialisierer Konstruktor Klammern optional?] (Http://stackoverflow.com/questions/3661025/why-are-c-sharp-3-0-object-initializer-constructor-parentheses -optional) – CharlesB

Antwort

6

Wenn Sie die Initialisierungsliste verwenden, können Sie das() weglassen, wenn Sie einen parameterlosen Konstruktor verwenden. Es spielt keine Rolle mit der neuen Katze() ist in der Liste oder nicht.

6

Sie müssen () angeben, wenn es keinen standardmäßigen (parameterlosen) Konstruktor gibt - wenn Sie Parameter angeben müssen.

Wenn eine Klasse über einen Standardkonstruktor (oder einen parameterlosen) verfügt, können Sie () immer weglassen, wenn Sie einen Initialisierer verwenden. Der Compiler macht die Magie für Sie und Sie können sich Dinge wie denken - der Compiler fügt sie für Sie ein.

+0

Wenn es keinen Standardkonstruktor() gibt, würde nicht funktionieren, nein? Das Beispiel, das ich oben angegeben habe, stammt von MSDN, und dort hat die Cat-Klasse keine Konstruktoren, was bedeutet, dass es eine Standard-Klasse gibt. –

+0

Diese Antwort ist falsch, wie es derzeit ist. Sie können das() nicht immer weglassen. "neue Katze;" würde nicht funktionieren. Sie können es weglassen, wenn Sie die Initialisierungsliste verwenden. – user1908061

+0

@YechielLabunskiy - Nein, es würde nicht funktionieren. Der Standardkonstruktor ist derjenige, der generiert wird, wenn Sie _don't_ keinen Konstruktor angeben und er ist parameterlos. – Oded

0

Es gibt keinen wirklichen Unterschied, für welche der beiden Sie sich entscheiden. Vergleichen Sie diese beiden Cat Instanzen:

var catA = new Cat(); // traditional constructor 
catA.Name = "Mittens"; // set property 

var catB = new Cat { Name = "Not Mittens" }; // all in one initializer 

Sie in der Funktionalität identisch sind, nur eine Verknüpfung Notation. Der erste Weg ist die traditionelle Art und Weise, die meisten objektorientierten (OO) Sprachen erstellen Objekte mit dem Konstruktor. C# hat kürzlich diese neue Methode zum Erstellen von Objekten und zum Festlegen von Eigenschaften hinzugefügt, um Code sauberer zu machen.

Auch wenn Ihre Klasse keinen parameterlosen Konstruktor hat (new()), können Sie die {...} Initialisierung trotzdem verwenden.

Bedenken Sie:

var dogA = new Dog("Fido"); 
var dogA.Age = 12; 

var dogB = new Dog("Not Fido") { Age = 7 }; 

Auch wenn Parameter erforderlich sind im Konstruktor, können Sie immer noch diese Art der Initialisierung verwenden, solange Sie sie liefern.

+0

Sie sind nicht völlig identisch und es gibt einen Unterschied. Lesen Sie http://haacked.com/archive/2013/01/11/hidden-pitfalls-with-object-initializers.aspx für weitere Informationen. :) – user1908061