Właściwości (Przewodnik programowania w języku C#)

Właściwość jest elementem członkowskim, który zapewnia elastyczny mechanizm odczytu, zapisu lub obliczania wartości pola prywatnego. Właściwości mogą być używane tak, jakby były elementami członkowskimi danych publicznych, ale są to specjalne metody nazywane metodami dostępu. Ta funkcja umożliwia łatwe uzyskiwanie dostępu do danych i nadal pomaga promować bezpieczeństwo i elastyczność metod.

Przegląd właściwości

  • Właściwości umożliwiają klasie uwidacznianie publicznego sposobu uzyskiwania i ustawiania wartości podczas ukrywania implementacji lub kodu weryfikacyjnego.
  • Metodę dostępu do właściwości get służy do zwracania wartości właściwości, a element dostępu właściwości zestawu służy do przypisywania nowej wartości. Akcesor właściwości init służy do przypisywania nowej wartości tylko podczas budowy obiektu. Te metody dostępu mogą mieć różne poziomy dostępu. Aby uzyskać więcej informacji, zobacz Ograniczanie ułatwień dostępu dostępu.
  • Słowo kluczowe value służy do definiowania wartości set przypisywanej przez metodę lub init metody dostępu.
  • Właściwości mogą być do odczytu i zapisu (mają zarówno get metodę dostępu, jak i set metodę dostępu), tylko do odczytu (mają get metodę dostępu, ale bez set metody dostępu) lub tylko do zapisu (mają set akcesorium, ale bez get akcesoriów). Właściwości tylko do zapisu są rzadkie i są najczęściej używane do ograniczania dostępu do poufnych danych.
  • Proste właściwości, które nie wymagają niestandardowego kodu dostępu, można zaimplementować jako definicje treści wyrażenia lub jako właściwości implementowane automatycznie.

Właściwości z polami zapasowymi

Jeden podstawowy wzorzec implementacji właściwości obejmuje użycie prywatnego pola zapasowego do ustawiania i pobierania wartości właściwości. Metoda get dostępu zwraca wartość pola prywatnego, a set metoda dostępu może przeprowadzić weryfikację danych przed przypisaniem wartości do pola prywatnego. Oba metody dostępu mogą również wykonać konwersję lub obliczenia na danych przed ich zapisaniem lub zwróceniem.

Poniższy przykład ilustruje ten wzorzec. W tym przykładzie TimePeriod klasa reprezentuje interwał czasu. Wewnętrznie klasa przechowuje interwał czasu w sekundach w polu prywatnym o nazwie _seconds. Właściwość odczytu i zapisu o nazwie Hours umożliwia klientowi określenie interwału czasu w godzinach. Zarówno metody dostępu, jak get i set wykonują niezbędną konwersję między godzinami a sekundami. Ponadto set metoda dostępu weryfikuje ArgumentOutOfRangeException dane i zgłasza błąd, jeśli liczba godzin jest nieprawidłowa.

public class TimePeriod
{
    private double _seconds;

    public double Hours
    {
        get { return _seconds / 3600; }
        set
        {
            if (value < 0 || value > 24)
                throw new ArgumentOutOfRangeException(nameof(value),
                      "The valid range is between 0 and 24.");

            _seconds = value * 3600;
        }
    }
}

Możesz uzyskać dostęp do właściwości w celu pobrania i ustawienia wartości, jak pokazano w poniższym przykładzie:

TimePeriod t = new TimePeriod();
// The property assignment causes the 'set' accessor to be called.
t.Hours = 24;

// Retrieving the property causes the 'get' accessor to be called.
Console.WriteLine($"Time in hours: {t.Hours}");
// The example displays the following output:
//    Time in hours: 24

Definicje treści wyrażeń

Metody dostępu do właściwości często składają się z instrukcji jednowierszowych, które po prostu przypisują lub zwracają wynik wyrażenia. Te właściwości można zaimplementować jako elementy członkowskie wyrażeń. Definicje treści wyrażeń składają się z symbolu => , po którym następuje wyrażenie, które ma zostać przypisane do właściwości lub pobrane z tej właściwości.

Właściwości tylko do odczytu mogą implementować metodę get dostępu jako składową typu wyrażenie-bodied. W takim przypadku ani słowo kluczowe dostępu, ani getreturn słowo kluczowe nie jest używane. Poniższy przykład implementuje właściwość tylko Name do odczytu jako składową typu wyrażenie-bodied.

public class Person
{
    private string _firstName;
    private string _lastName;

    public Person(string first, string last)
    {
        _firstName = first;
        _lastName = last;
    }

    public string Name => $"{_firstName} {_lastName}";
}

Zarówno metodę get , jak i metodę set dostępu można zaimplementować jako składowe wyrażeń. W tym przypadku get słowa kluczowe i set muszą być obecne. Poniższy przykład ilustruje użycie definicji treści wyrażeń dla obu metod dostępu. Słowo return kluczowe nie jest używane z akcesorem get .

public class SaleItem
{
    string _name;
    decimal _cost;

    public SaleItem(string name, decimal cost)
    {
        _name = name;
        _cost = cost;
    }

    public string Name
    {
        get => _name;
        set => _name = value;
    }

    public decimal Price
    {
        get => _cost;
        set => _cost = value;
    }
}

Właściwości zaimplementowane automatycznie

W niektórych przypadkach właściwości get i set metody dostępu po prostu przypisują wartość lub pobierają wartość z pola zapasowego bez uwzględniania dodatkowej logiki. Korzystając z właściwości implementowanych automatycznie, możesz uprościć kod, a kompilator języka C# w sposób przezroczysty udostępnia pole zapasowe.

Jeśli właściwość ma zarówno metodę set dostępu a get , jak i (lub i getinit), oba muszą być implementowane automatycznie. Właściwość implementowana automatycznie definiuje się przy użyciu get słów kluczowych i set bez podawania żadnej implementacji. Poniższy przykład powtarza poprzedni, z tą różnicą, że Name i Price są właściwościami implementowanymi automatycznie. W przykładzie usunięto również sparametryzowany konstruktor, aby SaleItem obiekty zostały zainicjowane za pomocą wywołania konstruktora bez parametrów i inicjatora obiektu.

public class SaleItem
{
    public string Name
    { get; set; }

    public decimal Price
    { get; set; }
}

Właściwości zaimplementowane automatycznie mogą deklarować różne możliwości dostępu dla metod get i set . Często deklarujesz publiczny get dostęp i dostęp prywatny set . Więcej informacji można dowiedzieć się w artykule dotyczącym ograniczania ułatwień dostępu dostępu.

Wymagane właściwości

Począwszy od języka C# 11, można dodać required element członkowski, aby wymusić kod klienta, aby zainicjować dowolną właściwość lub pole:

public class SaleItem
{
    public required string Name
    { get; set; }

    public required decimal Price
    { get; set; }
}

Aby utworzyć obiekt SaleItem, należy ustawić właściwości Name i Price przy użyciu inicjatorów obiektów, jak pokazano w poniższym kodzie:

var item = new SaleItem { Name = "Shoes", Price = 19.95m };
Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");

Specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz Właściwości w specyfikacji języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.

Zobacz też