Automatisch geïmplementeerde eigenschappen
Automatisch geïmplementeerde eigenschappen maken eigenschapsdeclaratie beknopter wanneer er geen andere logica is vereist in de eigenschapstoegangsors. Ze maken ook clientcode in staat om objecten te maken. Wanneer u een eigenschap declareert zoals wordt weergegeven in het volgende voorbeeld, maakt de compiler een privé, anoniem back-upveld dat alleen toegankelijk is via de get
eigenschappen en set
accessors. init
accessors kunnen ook worden gedeclareerd als automatisch geïmplementeerde eigenschappen.
In het volgende voorbeeld ziet u een eenvoudige klasse met enkele automatisch geïmplementeerde eigenschappen:
// 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;
}
}
U kunt geen automatisch geïmplementeerde eigenschappen declareren in interfaces. Automatisch geïmplementeerde en door velden ondersteunde eigenschappen declareren een back-upveld van een privé-exemplaar en interfaces kunnen geen instantievelden declareren. Het declareren van een eigenschap in een interface zonder een hoofdtekst te definiëren, declareert een eigenschap met accessors. Elk type dat die interface implementeert, moet die eigenschap implementeren.
U kunt automatisch geïmplementeerde eigenschappen initialiseren die vergelijkbaar zijn met velden:
public string FirstName { get; set; } = "Jane";
De klasse die in het vorige voorbeeld wordt weergegeven, kan worden gedempt. Clientcode kan de waarden in objecten wijzigen na het maken. In complexe klassen die significant gedrag (methoden) en gegevens bevatten, is het vaak nodig om openbare eigenschappen te hebben. Voor kleine klassen of structs die alleen een set waarden (gegevens) inkapselen en weinig of geen gedrag hebben, moet u echter een van de volgende opties gebruiken om de objecten onveranderbaar te maken:
- Declareer alleen een
get
accessor (onveranderbaar overal behalve de constructor). - Declareer een
get
accessor en eeninit
accessor (onveranderbaar overal behalve tijdens de constructie van objecten). - Declareer de
set
toegangsrechten als privé (onveranderbaar voor consumenten).
Zie Een lichtgewicht klasse implementeren met automatisch geïmplementeerde eigenschappen voor meer informatie.
Mogelijk moet u validatie toevoegen aan een automatisch geïmplementeerde eigenschap. C# 13 voegt eigenschappen met veldsteun toe als preview-functie. U gebruikt het field
trefwoord om toegang te krijgen tot het gesynthetiseerde backingveld van een automatisch geïmplementeerde eigenschap. U kunt er bijvoorbeeld voor zorgen dat de FirstName
eigenschap in het voorgaande voorbeeld niet kan worden ingesteld null
op of de lege tekenreeks:
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";
Met deze functie kunt u logica toevoegen aan accessors zonder dat u het backingveld expliciet hoeft te declareren. U gebruikt het field
trefwoord om toegang te krijgen tot het backingveld dat door de compiler is gegenereerd.
Belangrijk
Het field
trefwoord is een preview-functie in C# 13. U moet .NET 9 gebruiken en het <LangVersion>
element preview
instellen op in uw projectbestand om het field
contextuele trefwoord te kunnen gebruiken.
Wees voorzichtig met het gebruik van de trefwoordfunctie in een klasse met een veld met de field
naam field
. Het nieuwe field
trefwoord schaduwt een veld met de naam field
in het bereik van een eigenschapstoegangsor. U kunt de naam van de field
variabele wijzigen of het @
token gebruiken om naar de field
id te verwijzen.@field
Meer informatie vindt u door de functiespecificatie voor het field
trefwoord te lezen.