Sdílet prostřednictvím


Automaticky implementované vlastnosti

Automaticky implementované vlastnosti usnadňují deklaraci vlastností, pokud se v přístupových objektech vlastností nevyžaduje žádná jiná logika. Umožňují také klientskému kódu vytvářet objekty. Když deklarujete vlastnost, jak je znázorněno v následujícím příkladu, kompilátor vytvoří privátní anonymní backingové pole, ke kterému lze přistupovat pouze prostřednictvím vlastností get a set přístupových objektů. init Přístupové objekty lze také deklarovat jako automaticky implementované vlastnosti.

Následující příklad ukazuje jednoduchou třídu, která má některé automaticky implementované vlastnosti:

// 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;
    }
}

V rozhraních nemůžete deklarovat automaticky implementované vlastnosti. Automaticky implementované vlastnosti a vlastnosti zálohované privátní instance deklarují pole a rozhraní nemohou deklarovat pole instance. Deklarování vlastnosti v rozhraní bez definování těla deklaruje vlastnost s příslušenstvím. Každý typ, který implementuje toto rozhraní, musí implementovat tuto vlastnost.

Automaticky implementované vlastnosti můžete inicializovat podobně jako pole:

public string FirstName { get; set; } = "Jane";

Třída zobrazená v předchozím příkladu je proměnlivá. Klientský kód může po vytvoření změnit hodnoty v objektech. Ve složitých třídách, které obsahují významné chování (metody) a data, je často nutné mít veřejné vlastnosti. U malých tříd nebo struktur, které pouze zapouzdřují sadu hodnot (dat) a mají malé nebo žádné chování, byste měli použít jednu z následujících možností, aby objekty byly neměnné:

  • Deklarujte pouze přístupový objekt get (neměnný všude kromě konstruktoru).
  • Deklarujte get příslušenství a init příslušenství (neměnné všude kromě vytváření objektů).
  • Deklarujte set přístup jako soukromý (neměnný pro uživatele).

Další informace naleznete v tématu Jak implementovat odlehčenou třídu s automaticky implementovanými vlastnostmi.

Možná budete muset přidat ověření do automaticky implementované vlastnosti. C# 13 přidá vlastnosti založené na polích jako funkci Preview. Klíčové slovo použijete field pro přístup k syntetizovanému poli kompilátoru backingu automaticky implementované vlastnosti. Můžete například zajistit, aby FirstName vlastnost v předchozím příkladu nebyla nastavena na null prázdný řetězec ani na tento prázdný řetězec:

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";

Tato funkce umožňuje přidat logiku do přístupových objektů, aniž byste museli explicitně deklarovat backingové pole. Klíčové slovo použijete field pro přístup k backingu pole vygenerovaném kompilátorem.

Důležité

Klíčové field slovo je funkce preview v jazyce C# 13. Pokud chcete použít field kontextové klíčové slovo, musíte použít .NET 9 a nastavit prvek <LangVersion> do preview souboru projektu.

Měli byste být opatrní pomocí funkce klíčového field slova ve třídě, která má pole s názvem field. Nové field klíčové slovo stínuje pole pojmenované field v oboru přístupového objektu vlastnosti. Můžete změnit název field proměnné nebo pomocí @ tokenu odkazovat na field identifikátor jako @field. Další informace najdete ve specifikaci funkce pro field klíčové slovo.

Viz také