Dies ist eine neue C # 6-Funktion, "Getter-only auto-properties", auch bekannt als "Auto-Property Initializers for Read-Only Properties", wie in diesem MSDN-Zeitschriftenartikel "C #: The New and Improved C # 6.0" von Mark beschrieben Michaelis und im C # 6.0-Entwurf der Sprachspezifikation .
Auf den Setter des schreibgeschützten Felds kann nur im Konstruktor zugegriffen werden. In allen anderen Szenarien ist das Feld weiterhin schreibgeschützt und verhält sich wie zuvor.
Dies ist eine praktische Syntax, um die Menge an Code zu reduzieren, die Sie eingeben müssen, und um die Notwendigkeit zu beseitigen, eine Variable auf privater Modulebene explizit zu deklarieren, um den Wert zu speichern.
Diese Funktion wurde als wichtig angesehen, da seit der Einführung der automatisch implementierten Eigenschaften in C # 3 veränderbare Eigenschaften (mit Getter und Setter) schneller zu schreiben waren als unveränderliche (mit nur Getter), was bedeutet, dass dies Personen waren Sie sind versucht, veränderbare Eigenschaften zu verwenden, um zu vermeiden, dass Sie den Code für ein Hintergrundfeld eingeben müssen, das normalerweise für schreibgeschützte Eigenschaften erforderlich ist. Weitere Informationen zu automatisch implementierten Eigenschaften finden Sie im entsprechenden Abschnitt des Microsoft C # -Programmierhandbuchs .
Dieser Blog-Beitrag '# 1,207 - C # 6.0 - Auto-Property-Initialisierer für schreibgeschützte Eigenschaften' von Sean Sexton enthält eine gute Erklärung und ein Beispiel wie folgt:
Wenn Sie vor C # 6.0 eine schreibgeschützte (unveränderliche) Eigenschaft wünschen, verwenden Sie normalerweise ein schreibgeschütztes Sicherungsfeld, das im Konstruktor initialisiert wird, wie unten gezeigt.
public class Dog
{
public string Name { get; set; }
// DogCreationTime is immutable
private readonly DateTime creTime;
public DateTime DogCreationTime
{
get { return creTime; }
}
public Dog(string name)
{
Name = name;
creTime = DateTime.Now;
}
}
In C # 6.0 können Sie automatisch implementierte Eigenschaften verwenden, um eine schreibgeschützte Eigenschaft zu implementieren. Verwenden Sie dazu einen Auto-Property-Initialisierer. Das Ergebnis ist viel sauberer als im obigen Beispiel, in dem wir explizit ein Hintergrundfeld deklarieren mussten.
public class Dog
{
public string Name { get; set; }
// DogCreationTime is immutable
public DateTime DogCreationTime { get; } = DateTime.Now;
public Dog(string name)
{
Name = name;
}
}
Weitere Details finden Sie auch im Dotnet Roslyn Repo auf GitHub :
Auto-Eigenschaften können jetzt ohne Setter deklariert werden.
Das Hintergrundfeld einer Nur-Getter-Auto-Eigenschaft wird implizit als schreibgeschützt deklariert (obwohl dies nur für Reflexionszwecke von Bedeutung ist). Sie kann wie im obigen Beispiel über einen Initialisierer für die Eigenschaft initialisiert werden. Außerdem kann im Konstruktorkörper des deklarierenden Typs eine Nur-Getter-Eigenschaft zugewiesen werden, wodurch der Wert direkt dem zugrunde liegenden Feld zugewiesen wird:
Hier geht es darum, Typen präziser auszudrücken, aber beachten Sie, dass dadurch auch ein wichtiger Unterschied in der Sprache zwischen veränderlichen und unveränderlichen Typen beseitigt wird: Auto-Eigenschaften waren nur dann eine Abkürzung, wenn Sie bereit waren, Ihre Klasse veränderbar zu machen, und damit die Versuchung, Standardwerte zu verwenden das war toll. Mit den Nur-Getter-Auto-Eigenschaften wurde das Spielfeld zwischen veränderlich und unveränderlich ausgeglichen.
und im Entwurf der Sprachspezifikation C # 6.0 (Hinweis: Die Sprachspezifikation ist für Microsoft endgültig, muss jedoch noch als EMCA / ISO-Standard genehmigt werden , daher der „Entwurf“):
Automatisch implementierte Eigenschaften
Eine automatisch implementierte Eigenschaft (oder kurz Auto-Eigenschaft) ist eine nicht abstrakte nicht externe Eigenschaft mit Nur-Semikolon-Zugriffskörpern. Auto-Eigenschaften müssen einen Get-Accessor haben und können optional einen festgelegten Accessor haben.
Wenn eine Eigenschaft als automatisch implementierte Eigenschaft angegeben wird, ist automatisch ein verstecktes Sicherungsfeld für die Eigenschaft verfügbar, und die Accessoren werden implementiert, um aus diesem Sicherungsfeld zu lesen und in dieses zu schreiben. Wenn für die Auto-Eigenschaft kein Accessor festgelegt ist, wird das Hintergrundfeld als schreibgeschützt (schreibgeschützte Felder) betrachtet. Genau wie ein schreibgeschütztes Feld kann auch im Body eines Konstruktors der einschließenden Klasse eine Nur-Getter-Auto-Eigenschaft zugewiesen werden. Eine solche Zuweisung wird direkt dem schreibgeschützten Hintergrundfeld der Eigenschaft zugewiesen.
Eine Auto-Eigenschaft kann optional einen property_initializer haben, der als variable_initializer (Variable initializers) direkt auf das Hintergrundfeld angewendet wird.