Automatisch implementierte Eigenschaften
Automatisch implementierte Eigenschaften machen die Eigenschaftsdeklaration präziser, wenn in den Eigenschaftenaccessoren keine andere Logik erforderlich ist. Zudem ermöglichen sie Clientcode das Erstellen von Objekten. Wenn Sie eine Eigenschaft wie im folgenden Beispiel gezeigt deklarieren, erstellt der Compiler ein privates, anonymes, dahinter liegendes Feld, auf das nur über get
und set
-Accessoren zugegriffen werden kann. init
Accessoren können auch als automatisch implementierte Eigenschaften deklariert werden.
Das folgende Beispiel zeigt eine einfache Klasse mit automatisch implementierten Eigenschaften:
// This class is mutable. Its data can be modified from
// outside the class.
public class Customer
{
// Auto-implemented properties for trivial get and set
public double TotalPurchases { get; set; }
public string Name { get; set; }
public int CustomerId { get; set; }
// Constructor
public Customer(double purchases, string name, int id)
{
TotalPurchases = purchases;
Name = name;
CustomerId = id;
}
// Methods
public string GetContactInfo() { return "ContactInfo"; }
public string GetTransactionHistory() { return "History"; }
// .. Additional methods, events, etc.
}
class Program
{
static void Main()
{
// Initialize a new object.
Customer cust1 = new Customer(4987.63, "Northwind", 90108);
// Modify a property.
cust1.TotalPurchases += 499.99;
}
}
Sie können keine automatisch implementierten Eigenschaften in Schnittstellen deklarieren. Automatisch implementierte und feldgesicherte Eigenschaften deklarieren ein privates Instanzsicherungsfeld, und Schnittstellen können Keine Instanzfelder deklarieren. Durch Deklarieren einer Eigenschaft in einer Schnittstelle ohne Definieren eines Textkörpers wird eine Eigenschaft mit Accessoren deklariert. Jeder Typ, der diese Schnittstelle implementiert, muss diese Eigenschaft implementieren.
Sie können automatisch implementierte Eigenschaften ähnlich wie Felder initialisieren:
public string FirstName { get; set; } = "Jane";
Die im vorherigen Beispiel gezeigte Klasse kann geändert werden. Der Clientcode kann die Werte in Objekten nach der Erstellung ändern. In komplexen Klassen mit signifikantem Verhalten (Methoden) sowie Daten, ist es oft notwendig, öffentliche Eigenschaften zu haben. Für kleine Klassen oder Strukturen, die nur einen Satz von Werten (Daten) kapseln und wenig oder kein Verhalten aufweisen, sollten Sie jedoch eine der folgenden Optionen verwenden, um die Objekte unveränderlich zu machen:
- Deklarieren Sie nur eine
get
-Zugriffsmethode (überall unveränderlich mit Ausnahme des Konstruktors). - Deklarieren Sie eine
get
-Zugriffsmethode und eineinit
-Zugriffsmethode (überall unveränderlich außer während der Objekterstellung). - Deklarieren Sie die
set
-Zugriffsmethode als privat (unveränderlich für Consumer).
Weitere Informationen finden Sie unter Implementieren einer einfachen Klasse mit automatisch implementierten Eigenschaften.
Möglicherweise müssen Sie einer automatisch implementierten Eigenschaft eine Überprüfung hinzufügen. C# 13 fügt feldgesicherte Eigenschaften als Vorschaufeature hinzu. Sie verwenden das field
Schlüsselwort, um auf das compilersynthetisierte Sicherungsfeld einer automatisch implementierten Eigenschaft zuzugreifen. Sie können beispielsweise sicherstellen, dass die FirstName
Eigenschaft im vorherigen Beispiel nicht auf null
oder die leere Zeichenfolge festgelegt werden kann:
public string FirstName
{
get;
set
{
field = (string.IsNullOrWhiteSpace(value) is false
? value
: throw new ArgumentException(nameof(value), "First name can't be whitespace or null"));
}
} = "Jane";
Mit diesem Feature können Sie Accessoren Logik hinzufügen, ohne dass Sie das Sicherungsfeld explizit deklarieren müssen. Sie verwenden das field
Schlüsselwort, um auf das vom Compiler generierte Sicherungsfeld zuzugreifen.
Wichtig
Das field
Schlüsselwort ist ein Vorschaufeature in C# 13. Sie müssen .NET 9 verwenden und das <LangVersion>
Element preview
in Der Projektdatei festlegen, um das field
Kontextschlüsselwort zu verwenden.
Achten Sie darauf, die field
Schlüsselwortfunktion in einer Klasse zu verwenden, die ein Feld mit dem Namen field
hat. Das neue field
Schlüsselwort schattiert ein Feld, das im Bereich eines Eigenschaftenaccessors benannt field
ist. Sie können entweder den Namen der field
Variablen ändern oder das @
Token verwenden, um auf den field
Bezeichner zu verweisen als @field
. Weitere Informationen erhalten Sie, indem Sie die Featurespezifikation für das field
Schlüsselwort lesen.