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ę lubinit
metody dostępu. - Właściwości mogą być do odczytu i zapisu (mają zarówno
get
metodę dostępu, jak iset
metodę dostępu), tylko do odczytu (mająget
metodę dostępu, ale bezset
metody dostępu) lub tylko do zapisu (mająset
akcesorium, ale bezget
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 get
return
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 get
init
), 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}");
Sekcje pokrewne
- Używanie właściwości
- Właściwości interfejsu
- Porównanie właściwości i indeksatorów
- Ograniczanie dostępności metody dostępu
- Właściwości zaimplementowane automatycznie
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ż
- Indexers (Indeksatory)
- init , słowo kluczowe
- get słowo kluczowe
- ustaw słowo kluczowe
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla