To jest nowa funkcja języka C # 6, „właściwości automatyczne tylko do pobierania”, znana również jako „Inicjatory właściwości automatycznych dla właściwości tylko do odczytu”, jak omówiono w tym artykule z magazynu MSDN „C #: The New and Improved C # 6.0” autorstwa Marka Michaelis iw specyfikacji języka C # 6.0 .
Metoda ustawiająca pole tylko do odczytu jest dostępna tylko w konstruktorze, we wszystkich innych scenariuszach pole jest nadal tylko do odczytu i zachowuje się jak poprzednio.
Jest to wygodna składnia, która zmniejsza ilość kodu, który trzeba wpisać, i eliminuje potrzebę jawnego zadeklarowania zmiennej poziomu modułu prywatnego do przechowywania wartości.
Ta funkcja była postrzegana jako ważna, ponieważ od czasu wprowadzenia właściwości implementowanych automatycznie w C # 3, zmienne właściwości (te z funkcją pobierającą i ustawiającą) stały się szybsze w zapisie niż niezmienne (te z tylko funkcją pobierającą), co oznacza, że ludzie byli jest kuszony do używania właściwości modyfikowalnych, aby uniknąć konieczności wpisywania kodu dla pola zapasowego, które zwykle jest wymagane dla właściwości tylko do odczytu. Więcej informacji na temat właściwości implementowanych automatycznie znajduje się w odpowiedniej sekcji przewodnika programowania C # firmy Microsoft .
Ten wpis na blogu „# 1,207 - C # 6.0 - Auto-inicjatory właściwości dla właściwości tylko do odczytu” autorstwa Seana Sextona zawiera dobre wyjaśnienie i przykład w następujący sposób:
Przed C # 6,0, jeśli chcesz mieć właściwość tylko do odczytu (niezmienną), zwykle używałbyś pola zapasowego tylko do odczytu, które jest inicjowane w konstruktorze, jak pokazano poniżej.
public class Dog
{
public string Name { get; set; }
private readonly DateTime creTime;
public DateTime DogCreationTime
{
get { return creTime; }
}
public Dog(string name)
{
Name = name;
creTime = DateTime.Now;
}
}
W C # 6,0 można użyć właściwości zaimplementowanych automatycznie, aby zaimplementować właściwość tylko do odczytu. Robisz to za pomocą inicjatora właściwości automatycznych. Wynik jest znacznie czystszy niż w powyższym przykładzie, w którym musieliśmy jawnie zadeklarować pole zapasowe.
public class Dog
{
public string Name { get; set; }
public DateTime DogCreationTime { get; } = DateTime.Now;
public Dog(string name)
{
Name = name;
}
}
Więcej szczegółów można również znaleźć w repozytorium dotnet Roslyn w serwisie GitHub :
Właściwości automatyczne można teraz deklarować bez metody ustawiającej.
Pole zapasowe właściwości automatycznej tylko do pobierania jest niejawnie zadeklarowane jako tylko do odczytu (choć ma to znaczenie tylko dla celów refleksji). Można go zainicjować za pomocą inicjatora we właściwości, jak w powyższym przykładzie. Ponadto w treści konstruktora typu deklarującego można przypisać właściwość tylko do pobierania, co powoduje, że wartość jest przypisywana bezpośrednio do pola bazowego:
Chodzi o bardziej zwięzłe wyrażanie typów, ale pamiętaj, że usuwa również ważną różnicę w języku między typami zmiennymi i niezmiennymi: właściwości automatyczne były skrótem dostępnym tylko wtedy, gdy chciałeś uczynić swoją klasę zmienną, a więc pokusa do domyślnego do tego było świetne. Teraz, dzięki właściwościom automatycznym tylko getter, pole gry zostało wyrównane między zmiennymi a niezmiennymi.
oraz w wersji roboczej specyfikacji języka C # 6.0 (uwaga: specyfikacja języka jest ostateczna, jeśli chodzi o Microsoft, ale nie została jeszcze zatwierdzona jako norma EMCA / ISO , stąd `` wersja robocza ''):
Właściwości wdrażane automatycznie
Właściwość zaimplementowana automatycznie (lub w skrócie właściwość auto) jest nieabstrakcyjną właściwością niebędącą zewnętrzną z treściami akcesorów tylko średnikami. Właściwości automatyczne muszą mieć metodę dostępu pobierania i opcjonalnie mogą mieć metodę dostępu set.
Gdy właściwość jest określona jako właściwość zaimplementowana automatycznie, ukryte pole zapasowe jest automatycznie dostępne dla właściwości, a metody dostępu są zaimplementowane w celu odczytu i zapisu w tym polu zapasowym. Jeśli właściwość auto nie ma ustawionego akcesora, pole zapasowe jest traktowane jako tylko do odczytu (pola tylko do odczytu). Podobnie jak w przypadku pola tylko do odczytu, w treści konstruktora klasy otaczającej można przypisać właściwość automatyczną tylko do pobierania. Takie przypisanie jest przypisywane bezpośrednio do pola zapasowego tylko do odczytu właściwości.
Właściwość auto może opcjonalnie mieć property_initializer, który jest stosowany bezpośrednio do pola zapasowego jako zmienna_inicjalizator (inicjatory zmiennych).