W przeszłości deklarowaliśmy takie właściwości:
public class MyClass
{
private int _age;
public int Age
{
get{ return _age; }
set{ _age = value; }
}
}
Teraz możemy:
public class MyClass
{
public int Age {get; set;}
}
Moje pytanie brzmi: w jaki sposób mogę uzyskać dostęp do prywatnej zmiennej, która jest tworzona automatycznie przy użyciu tej notacji?
Wolałbym raczej uzyskać dostęp do zmiennej prywatnej, a nie do publicznego akcesora „Wiek”. Czy istnieje domyślna notacja dostępu do zmiennej prywatnej, czy po prostu nie jest to możliwe?
c#
properties
publiczne statyczne
źródło
źródło
Odpowiedzi:
Celem nowych właściwości automatycznych jest zmniejszenie ilości kodu standardowego, który trzeba napisać, gdy mamy tylko prostą właściwość, która nie wymaga żadnej specjalnej logiki w get lub zestawie.
Jeśli chcesz uzyskać dostęp do prywatnego członka, którego używają te właściwości, jest to zwykle z kilku powodów:
Chcesz mieć tylko publiczny dostęp do odczytu (tj. Po prostu „pobierz”), a klasa zapisuje bezpośrednio do członka - w takim przypadku możesz użyć prywatnego zestawu w swojej właściwości automatycznej. to znaczy
public class MyClass { public int Age {get; private set;} }
Zwykle obejmuje to większość powodów, dla których chcesz bezpośrednio przejść do pola zapasowego używanego przez właściwości automatyczne.
źródło
Korzystanie z właściwości automatycznych oznacza, że nie potrzebujesz żadnej logiki pobierania / ustawiania właściwości, dlatego prywatna zmienna zapasowa jest niepotrzebna.
Nie używaj właściwości automatycznych, jeśli masz jakąś złożoną logikę w swojej klasie. Po prostu idź
private int _age
i normalne pobierające / ustawiające, jak zwykle.IMO, właściwości automatyczne są bardziej odpowiednie do szybkiego wdrażania obiektów jednorazowego użytku lub tymczasowych kapsułek danych, takich jak:
public class TempMessage { public int FromID { get; set; } public int ToID { get; set; } public string Message { get; set; } }
Gdzie nie potrzebujesz dużo logiki.
źródło
Ta składnia jest powszechnie nazywana „cukrem składniowym”, co oznacza, że kompilator przyjmuje tę składnię i tłumaczy ją na coś innego. W twoim przykładzie kompilator wygeneruje kod, który wygląda mniej więcej tak:
[CompilerGenerated] private int <Age>k_BackingField; public int Age { [CompilerGenerated] get { return this.<Age>k_BackingField; } [CompilerGenerated] set { this.<Age>k_BackingField = value; }
Nawet wiedząc o tym wszystkim, prawdopodobnie można uzyskać bezpośredni dostęp do pola zapasowego, ale w ten sposób udaremnia się cel używania właściwości automatycznych. Mówię tutaj prawdopodobnie, ponieważ wtedy polegasz na szczegółach implementacji, które mogą ulec zmianie w dowolnym momencie w przyszłej wersji kompilatora C #.
źródło
Od C # 3.0 Automatyczne właściwości wyjaśnione
Chociaż możliwe jest bezpośrednie użycie tego prywatnego członka, jest to bardzo hakerskie i niepotrzebne.
źródło
Nie powinieneś i jest bardzo mało prawdopodobne, że będziesz musiał. Jeśli potrzebujesz dostępu do nieruchomości, po prostu użyj własności publicznej (np. This.Age). Nie ma nic specjalnego w prywatnym polu wspierającym własność publiczną, używanie go zamiast własności jest po prostu przesądem.
źródło
Nie możesz, jest to funkcja języka w przeciwieństwie do funkcji IDE. Szczerze mówiąc, wolałbym wtedy IDE dodać prywatną zmienną za Ciebie. Zgadzam się, że to trochę dziwne, że klasa musi wewnętrznie używać publicznego punktu wejścia, aby uzyskać dostęp do własnych zmiennych. Dlatego sam nie korzystam zbyt często z tej nowej funkcji.
źródło