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
.