Kurs C# cz. 5 – Właściwości (Properties)
UWAGA! Już teraz sprawdź NOWY, JESZCZE LEPSZY kurs C#, którzy przygotowałem. Znajdziesz go po TYM linkiem.
W czwartej części kursu powiedziałem Wam co nieco o metodach w języku C#. Od tej pory nasze klasy nie tylko przechowują dane, ale też mogą na nich wykonywać operacje.
Tym razem dowiemy się o jeszcze jednej konstrukcji, która jest związana z klasami i przechowywaniem w nim danych. W dzisiejszej części nauczymy się o właściwościach w klasach.
1. Właściwie co to właściwości?
Właściwości są pewnego rodzaju połączeniem zmiennych i metod. Jeśli pisałeś już w innych językach obiektowych to być może zdarzyło Ci się pisać metody, które zwracały wartość prywatnej zmiennej z klasy, albo ustawiały jej nową wartość. W C# oczywiście również możesz je pisać, jednak ten język dodaje w tym temacie „lukier składniowy”, dzięki czemu zapis jest krótszy i wg mnie czytelniejszy. Metody pobierające i ustawiające wartości zmiennej nazywają się potocznie getterami (zwracają wartość) i setterami (ustawiają wartość).
Polskie tłumaczenie nazwy „Property” brzmi trochę dziwnie, ale co poradzić.
2. Niech nasza klasa też ma swoją właściwość
Podstawowa struktura właściwości, która pobiera wartość ze zmiennej oraz ją ustawia wygląda tak:
public typ Nazwa { get { return _nazwa; } set { _nazwa = value; } }
„Nazwa” to nazwa naszej właściwości, która obsługuje dane typu „typ”. „_nazwa” to zmienna w klasie. „value” jest słowem kluczowym i zawiera wartość przekazaną do naszej właściwości.
Struktura właściwości może wam trochę przypominać jakąś dziwaczną metodę. Tak jak mówiłem jest to w pewnym stopniu „obudowa” metod konkretnego rodzaju.
Blok get odpowiada za zwracanie wartości. Ta część jest wywoływana kiedy pobieramy wartość z właściwości:
var x = obiektKlasy.Nazwa;
Właściwości używany podobnie jak zmiennych.
Analogicznie blok set używany jest kiedy przypisujemy wartość do naszej właściwości:
obiektKlasy.Nazwa = 4;
W blokach get i set można oczywiście zawrzeć więcej instrukcji niż to co napisałem. Przykładowo wartość przed zwróceniem możemy pomnożyć, albo przed przypisaniem jej do naszej prywatnej zmiennej zmodyfikować np. zamiast przypisać cały string wyciągać z niego jakiś fragment, który chcemy w zmiennej przechowywać.
3. Trochę danych
Napisałem wcześniej, że właściwości to połączenie metod i zmiennych więc gdzie te zmienne, przecież to wygląda jak inny zapis zwykłych metod?
Owszem, do tej pory pokazałem właściwości jako specyficzne funkcje, ale teraz zobaczycie, że właściwości mogą również przechowywać wartość.
„Jak to?!!” zapytacie pewnie. Ano tak. Nie trzeba we właściwościach odnosić się do innej zmiennej znajdującej się w klasie. Stosując poniższy zapis właściwość będzie sama przechowywała wartość podanego typu:
public int Nazwa { get; set; }
Zapytasz teraz zapewne po co w takim razie to stosować skoro nie różni się niczym od zmiennej publicznej. Dużo pytań zadajecie, to dobrze. Stosowanie takiego zapisu jest przydatne, a czasami nawet wymagane w kilku przypadkach, których jeszcze nie omawialiśmy, np. w przypadku interfejsów.
4. Nie zmienisz mnie!
Oprócz tego co napisałem dodam na koniec jeszcze, że para get i set nie jest wymagana, można użyć samego bloku get wtedy poza klasą będzie można przez właściwość pobrać wartość zmiennej, ale nie będzie można jej ustawić. Tak samo nie jest wymuszone, żeby zarówno get jak i set były publiczne. Możemy chcieć móc przypisywać wartość do właściwości tylko wewnątrz klasy, wtedy możemy zapisać to w ten sposób:
public int Nazwa { get; private set; }
5. Słowo na koniec
Z podstawowych informacji to chyba będzie tyle. Tym razem nie pisałem kodów źródłowych całych klas i przykładowych funkcji main bo zakładam, że przyswoiliście sobie już informacje z poprzednich części i taka forma będzie dobrym sprawdzianem ;)
Witam,
Bardzo miło napisany kurs, ale mam pytanie – czy zamiast:
var x = Klasa.Nazwa;
nie powinno być
var x = obiektKlasy.Nazwa
???
Bardzo będę wdzięczny za odp.
Faktycznie, nieprecyzyjnie to napisałem :) Zgadza się, chodziło o obiekt klasy a nie klasę, tylko zrobiłem zbyt duży skrót myślowy.
Będzie poprawione
Wolałbym jednak gdyby były przykłady wykorzystania get i set, gdyż mam problem z wykorzystaniem właściwości :(