Udostępnij za pośrednictwem


Automatycznie zaimplementowane właściwości

Automatycznie zaimplementowane właściwości sprawiają, że deklaracja właściwości jest bardziej zwięzła, gdy żadna inna logika nie jest wymagana w metodach dostępu do właściwości. Umożliwiają one również kodowi klienta tworzenie obiektów. Po zadeklarowaniu właściwości, jak pokazano w poniższym przykładzie, kompilator tworzy prywatne, anonimowe pole zapasowe, do którego można uzyskać dostęp tylko za pośrednictwem właściwości get i set metod dostępu. init metody dostępu można również zadeklarować jako automatycznie zaimplementowane właściwości.

W poniższym przykładzie przedstawiono prostą klasę, która ma pewne automatycznie zaimplementowane właściwości:

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

Nie można zadeklarować automatycznie zaimplementowanych właściwości w interfejsach. Automatycznie zaimplementowane i obsługiwane przez pola właściwości deklarują pole kopii zapasowej wystąpienia prywatnego, a interfejsy nie mogą deklarować pól wystąpienia. Deklarowanie właściwości w interfejsie bez definiowania treści deklaruje właściwość z metodami dostępu. Każdy typ implementujący ten interfejs musi implementować tę właściwość.

Możesz zainicjować automatycznie zaimplementowane właściwości podobne do pól:

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

Klasa pokazana w poprzednim przykładzie jest modyfikowalna. Kod klienta może zmienić wartości w obiektach po utworzeniu. W złożonych klasach, które zawierają znaczące zachowanie (metody) i dane, często konieczne jest posiadanie właściwości publicznych. Jednak w przypadku małych klas lub struktur, które po prostu hermetyzują zestaw wartości (danych) i mają niewielkie lub żadne zachowania, należy użyć jednej z następujących opcji, aby obiekty stały się niezmienne:

  • Zadeklaruj tylko metodę get dostępu (niezmienną wszędzie z wyjątkiem konstruktora).
  • Zadeklaruj init metodę get dostępu i akcesorium (niezmienne wszędzie z wyjątkiem podczas budowy obiektu).
  • Zadeklaruj metodę dostępu jako prywatną set (niezmienną dla konsumentów).

Aby uzyskać więcej informacji, zobacz Jak zaimplementować lekką klasę z automatycznie zaimplementowanymi właściwościami.

Może być konieczne dodanie walidacji do automatycznie zaimplementowanych właściwości. Język C# 13 dodaje właściwości oparte na polach jako funkcję w wersji zapoznawczej. Słowo kluczowe służy do uzyskiwania field dostępu do pola syntetyzowanego tworzenia kopii zapasowej kompilatora automatycznie zaimplementowanej właściwości. Można na przykład upewnić się, że FirstName właściwość w poprzednim przykładzie nie może być ustawiona na null lub pusty ciąg:

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

Ta funkcja umożliwia dodawanie logiki do metod dostępu bez konieczności jawnego deklarowania pola zapasowego. Słowo kluczowe służy field do uzyskiwania dostępu do pola zapasowego wygenerowanego przez kompilator.

Ważne

Słowo field kluczowe jest funkcją w wersji zapoznawczej w języku C# 13. Musisz użyć platformy .NET 9 i ustawić element <LangVersion> na preview w pliku projektu, aby użyć field kontekstu słowa kluczowego.

Należy zachować ostrożność przy użyciu funkcji słowa kluczowego field w klasie, która ma pole o nazwie field. Nowe field słowo kluczowe cieniuje pole o nazwie field w zakresie metody dostępu właściwości. Możesz zmienić nazwę zmiennej field lub użyć tokenu @ , aby odwołać się do identyfikatora field jako @field. Aby dowiedzieć się więcej, przeczytaj specyfikację funkcji słowa kluczowego field.

Zobacz też