Dela via


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 en init 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.

Se även