Objektinitialisierer kühl sind, weil sie ermöglichen es Ihnen, richten Sie eine Klasse inline ein. Der Nachteil ist, dass Ihre Klasse nicht unveränderbar sein kann. Bedenken Sie:
public class Album
{
// Note that we make the setter 'private'
public string Name { get; private set; }
public string Artist { get; private set; }
public int Year { get; private set; }
public Album(string name, string artist, int year)
{
this.Name = name;
this.Artist = artist;
this.Year = year;
}
}
Wenn die Klasse auf diese Weise definiert ist, bedeutet es, dass es nicht wirklich eine einfache Möglichkeit, den Inhalt der Klasse zu ändern, nachdem es konstruiert wurde. Unveränderlichkeit hat Vorteile. Wenn etwas unveränderlich ist, ist es VIEL einfacher festzustellen, dass es korrekt ist. Wenn es nach der Konstruktion nicht geändert werden kann, gibt es keine Möglichkeit, dass es jemals "falsch" ist (sobald Sie festgestellt haben, dass seine Struktur korrekt ist).
new {
Name = "Some Name",
Artist = "Some Artist",
Year = 1994
};
die Compiler eine unveränderliche Klasse automatisch erstellen (das heißt, können anonyme Klassen nicht nach dem Bau geändert werden), weil Unveränderlichkeit nur, dass nützlich ist: Wenn Sie anonyme Klassen, wie zum Beispiel erstellen. Die meisten C++/Java-Styleguides ermutigen aus diesem Grund oft, Member const
(C++) oder final
(Java) zu machen. Größere Anwendungen sind einfach zu überprüfen, wenn weniger bewegliche Teile vorhanden sind.
Das alles gesagt, gibt es Situationen, wenn Sie die Struktur Ihrer Klasse schnell ändern können. Lassen Sie uns sagen, dass ich ein Werkzeug, das ich einrichten möchten:
public void Configure(ConfigurationSetup setup);
und ich habe eine Klasse, die eine Anzahl von Mitgliedern, zB:
class ConfigurationSetup {
public String Name { get; set; }
public String Location { get; set; }
public Int32 Size { get; set; }
public DateTime Time { get; set; }
// ... and some other configuration stuff...
}
Mit Objektinitialisierer Syntax ist nützlich, wenn ich will zu konfigurieren einige Kombination von Eigenschaften, aber nicht notwendig alle von ihnen auf einmal. Zum Beispiel, wenn ich die Name
und Location
nur konfigurieren möge, kann ich nur tun:
ConfigurationSetup setup = new ConfigurationSetup {
Name = "Some Name",
Location = "San Jose"
};
und dies ermöglicht es mir eine Kombination einzurichten, ohne einen neuen Konstruktor für jede möglicherweise Permutation definieren zu müssen.
Im Großen und Ganzen würde ich argumentieren, dass die Unveränderbarkeit Ihrer Klassen Ihnen auf lange Sicht viel Entwicklungszeit sparen wird, aber die Syntax des Objektinitialisierers vereinfacht die Einrichtung bestimmter Konfigurationspermutationen.
möglich Duplikat von [Was ist der Unterschied zwischen einem Objektinitialisierer und einem Konstruktor?] (Http: // stackoverflow.com/questions/740658/whats-the-difference-zwischen-einem-objekt-initializer-and-a-constructor) –
für eine im Konstruktor Sie könnten einen Wert zuweisen, um eine private Member-Variable mit Objekt-Initialisierer nur gehen Sie mit öffentlichen Eigenschaften – terrybozzio
Ihr Konstruktor zwingt Sie, Name, Künstler & Jahr zu übergeben. Sie sind optional für Ihren Objektinitiator. – Carra