Short Tip #02: widoczność Auto-Implemented Properties
Stare chińskie przysłowie mówi, że „Krótki fragment kodu wart jest więcej niż tysiąc słów.” Nie przedłużając więc:
class MyClass { private int _member; public int Member { get { return _member; } set { _member = value; } } public MyClass(int value) { _member = value; } }
Uściślając: w przykładowej klasie jest prywatna zmienna _member
, do której odwołujemy się z zewnątrz przez publiczną właściwość (ang. Property) Member
. Mechanika obsługi tej zmiennej przez właściwość nie jest zbyt wyszukana, więc możemy zastąpić ją tzw. Auto-Implemented Property (lub krócej Auto-Property). Poniżej tysiąc słów na ten temat:
class MyClass { public int Member { get; set; } public MyClass(int value) { Member = value; } }
Z poziomu kodu używającego klasy MyClass
nic się nie zmieniło (nadal odwołujemy się do pola Member
przez właściwość), ale w tym przypadku nie mamy explicite obiektu _member
wewnątrz klasy, kompilator wygeneruje go anonimowo, pozwalając na dostęp jedynie przez metody get
i set
.
Aby uczynić pole Member polem „tylko do odczytu” należy:
- w pierwszym przypadku usunąć metodę
set
z właściwości:class MyClass { private int _member; public int Member { get { return _member; } } public MyClass(int value) { _member = value; } }
- w drugim przypadku dołożyć przed
set
słowo kluczoweprivate
:class MyClass { public int Member { get; private set; } public MyClass(int value) { Member = value; } }
Przez ten zabieg otrzymujemy pole „tylko do odczytu” dla kodu z zewnątrz klasy.
Odpowiedzi: 2 Zostaw komentarz
Nikt nie każe nikomu używać słowa kluczowego var. Nigdzie. To jest tylko takie uproszczenie, dzięki któremu można nie pisać typu zmiennej gdy w instrukcji jej deklaracji następuje też przypisanie wartości. Kompilator może rozpoznać typ zmiennej dzięki temu przypisaniu, a programista oszczędza na pisaniu typu. Dla typów bool czy int to może nie jest żaden zysk, ale jak masz zmienną Dictionary<TVertex, List<TVertex, IEdge>> (sam ostatnio używałem podobnych potworków przy implementacji klasy grafu) to zysk jest oczywisty. Inna sprawą jest zaciemnianie kodu, np. widząc instrukcję ‚var x = MojaJakasFunkcja();’ nie bardzo wiadomo jakiego typu jest x (choć miły Visual Studio podpowie jak najedziesz kursorem na zmienną lub funkcję). Natomiast żadnego zaciemnienia nie ma w przypadku operatora new, np. ‚var x = new List();’ – wiadomo na pierwszy rzut oka czym jest x, a pisania jest mniej. Czy używać var czy nie to już indywidualny wybór. Ja jako leniwy człowiek w moich własnych projektach piszę var wszędzie gdzie się da 😉
Eh… C# był elegancki, a teraz obrasta w „możesz jedną rzecz zrobić na sto różnych sposobów” 🙁
Na przykład niedawno się dowiedziałem, że w foreach nie powinno się już podawać typu wprost – podobno należy stosować słowo kluczowe var… Na razie nie tego nie robię, póki nie przeczytam czym to grozi i z czym to się je…
Jeszcze trochę i nawet zmiennych deklarować nie będzie trzeba…