Automatiskt implementerade egenskaper
Automatiskt implementerade egenskaper gör egenskapsdeklarationen mer koncis när ingen annan logik krävs i egenskapsåtkomsterna. De aktiverar även klientkod för att skapa objekt. När du deklarerar en egenskap enligt följande exempel skapar kompilatorn ett privat, anonymt säkerhetskopieringsfält som bara kan nås via egenskapens get
och set
åtkomstgivarna. init
accessorer kan också deklareras som automatiskt implementerade egenskaper.
I följande exempel visas en enkel klass som har vissa automatiskt implementerade egenskaper:
// 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;
}
}
Du kan inte deklarera automatiskt implementerade egenskaper i gränssnitt. Automatiskt implementerade och fältstödda egenskaper deklarerar ett stödfält för privat instans och gränssnitt kan inte deklarera instansfält. Om du deklarerar en egenskap i ett gränssnitt utan att definiera en brödtext deklareras en egenskap med accessorer. Varje typ som implementerar gränssnittet måste implementera den egenskapen.
Du kan initiera automatiskt implementerade egenskaper på samma sätt som fält:
public string FirstName { get; set; } = "Jane";
Klassen som visas i föregående exempel kan ändras. Klientkoden kan ändra värdena i objekt när de har skapats. I komplexa klasser som innehåller betydande beteende (metoder) och data är det ofta nödvändigt att ha offentliga egenskaper. Men för små klasser eller structs som bara kapslar in en uppsättning värden (data) och har små eller inga beteenden bör du använda något av följande alternativ för att göra objekten oföränderliga:
- Deklarera endast en
get
accessor (oföränderlig överallt utom konstruktorn). - Deklarera en
get
accessor och eninit
accessor (oföränderlig överallt utom under objektkonstruktion). set
Deklarera accessorn som privat (oföränderlig för konsumenter).
Mer information finns i Implementera en lättviktsklass med automatiskt implementerade egenskaper.
Du kan behöva lägga till validering i en automatiskt implementerad egenskap. C# 13 lägger till fältstödda egenskaper som en förhandsversionsfunktion. Du använder nyckelordet field
för att komma åt kompilatorns syntetiserade bakgrundsfält för en automatiskt implementerad egenskap. Du kan till exempel se till att FirstName
egenskapen i föregående exempel inte kan anges till null
eller den tomma strängen:
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";
Med den här funktionen kan du lägga till logik i accessorer utan att du uttryckligen behöver deklarera bakgrundsfältet. Du använder nyckelordet field
för att komma åt det bakgrundsfält som genereras av kompilatorn.
Viktigt!
Nyckelordet field
är en förhandsgranskningsfunktion i C# 13. Du måste använda .NET 9 och ange <LangVersion>
elementet till preview
i projektfilen för att kunna använda det kontextuella nyckelordet field
.
Du bör vara försiktig med att använda nyckelordsfunktionen field
i en klass som har ett fält med namnet field
. Det nya field
nyckelordet skuggar ett fält med namnet field
i omfånget för en egenskapsåtkomst. Du kan antingen ändra namnet på variabeln field
eller använda @
token för att referera till identifieraren field
som @field
. Du kan läsa mer genom att läsa funktionsspecifikationen för nyckelordetfield
.