
Kurs C# cz. 4 – Metody
UWAGA! Już teraz sprawdź NOWY, JESZCZE LEPSZY kurs C#, którzy przygotowałem. Znajdziesz go po TYM linkiem.
Witam Wam w czwartej części kursu języka C#. W poprzedniej części kursu pokazałem Wam w dużym skrócie czym są klasy w C# oraz jak je tworzyć i używać. Poznaliśmy też sposób na dodanie w klasie kilku zmiennych, co pozwoliło nam w niej zebrać wiele wartości, które od teraz mogą być ze sobą logicznie związane w jednym miejscu. Ale jak zaraz się przekonacie nie z samych zmiennych klasa się składa.
Otóż nasze klasy mogą oprócz zmiennych zawierać również metody.
1. Co to ta metoda?
Metody, które będę też nazywał funkcjami mimo, że czasami się traktuje te dwa pojęcia jako osobne byty, pozwalają zbierać w jednym miejscu kod. Metody pozwalają nam używać w wielu miejscach tego samego kodu, czasami z różnymi parametrami, dzięki czemu unikniemy duplikacji wielokrotnie wykorzystywanych fragmentów. W bardzo dużym uproszczeniu funkcje w języku programowania można porównać do funkcji matematycznych, które dla podanych wartości (parametrów) dają pewien określony wynik. Z resztą w dalszych przykładach w tej części pojawią się metody obliczające jakąś wartość na podstawie przekazanego im parametru.
2. Dodajmy jakąś funkcję
W języku C# wszystkie instrukcje naszego programu muszą się znaleźć w metodach, dlatego już we wcześniejszych częściach kursu mogłeś spotkać się z tymi konstrukcjami. Ogólny schemat budowy metody wygląda następująco:
typ unikalna_nazwa(parametry) { //instrukcje }
Wszystkie metody w języku C#, w przeciwieństwie np. do C++, znajdują się w klasach. Dostajemy się do nich w podobny sposób jak do pól klasy. Mogą one mieć dostęp do prywatnych pól klasy, w której są zdefiniowane dzięki czemu możemy w naszej klasie przechowywać dodatkowe wartości, które mogą nam być potrzebne w innym miejscu bez konieczności udostępniania ich na zewnątrz klasy. Tutaj mamy przykład metody, która na podstawie publicznych wartości oblicza wartość, którą zapisuje do prywatnej zmiennej. Do tej zmiennej nie dostaniemy się z poziomu funkcji main (jak i każdej innej nie będącej metodą tej klasy), a więc drugi kod spowoduje pojawienie się błędu:
namespace Kurs { class Test { private int tajne; public int wartosc; public int innaWartosc; public void Licz() { tajne = wartosc + innaWartosc; } } }
namespace Kurs { class Program { static void Main(string[] args) { Test test = new Test(); test.wartosc = 2; test.innaWartosc = 5; test.Licz(); Console.WriteLine(test.tajne); //błąd } } }
3. Funkcjo daj nam!
Nasza metoda poza wykonywaniem różnych fragmentów kodu może także zwracać jakąś wartość. W takim wypadku po pierwsze musimy określić jakiego typu będzie to wartość, a potem wewnątrz metody dodać instrukcję return, która spowoduje zwrócenie wpisanej obok niej wartości oraz zakończenie wykonywania funkcji. Jeśli uznamy, że nie ma potrzeby aby nasza metoda cokolwiek zwracała wtedy jako zwracany typ wpisujemy void, co mogliście już zobaczyć we wcześniejszych przykładach. Jeśli jako zwracany typ podamy void wtedy metoda nie musi zawierać instrukcji return (no chyba, że w jakimś momencie chcemy przerwać jej działanie wcześniej niż po wykonaniu wszystkiego co się w niej znajduje. W takim wypadku korzystamy z wyrażenia return; bez podawania wartości, która ma zostać zwrócona). Jeśli zaś ustaliliśmy, że funkcja powinna coś zwracać światu to dla wszystkich ścieżek wykonania znajdującego się w niej kodu (będzie to istotne jak poznacie instrukcje warunkowe) musi zostać napisana instrukcja return. Poniżej przykład metody, która zwraca wartość typu int oraz sposób w jaki przypisujemy zwróconą warość do zmiennej:
namespace Kurs { class Test { public int Licz() { int wynik = 2 + 2; return wynik; } } }
namespace Kurs { class Program { static void Main(string[] args) { Test test = new Test(); int wynikZFunkcji = test.Licz(); Console.WriteLine(wynikZFunkcji); //4 } } }
4. Ukryte działanie
Metody tak jak zmienne mogą być zdefiniowane w klasie jako publiczne, chronione i prywatne. Zapytasz pewnie po co komu prywatna metoda, której nie można użyć na zewnątrz? Już śpieszę z wyjaśnieniem. Funkcja prywatna może się przydać np. w sytuacji kiedy w różnych metodach naszej klasy potrzebujemy wykonać podobny kawałek kodu, ale jednocześnie nie jest to fragment, który jako samodzielny byt mógłby być użyty w dowolnym innym miejscu w programie. Przykładowo w publicznych metodach naszej klasy jednym z etapów ich działania jest policzenie jakiegoś równania matematycznego, możemy oczywiście wpisać je bezpośrednio:
namespace Kurs { class Test { public int parametr; public int Kwadrat() { int wynik= parametr + 2 * (parametr - 4); return wynik * wynik; } public int Suma() { int wynik= parametr + 2 * (parametr - 4); return wynik + wynik; } } }
Jednak jeśli w obu przypadkach ma być liczone to samo taki zapis może spowodować błędy w przyszłości, np. kiedy będziemy chcieli zmienić działanie i przez nieuwagę zrobimy to tylko w jednym z dwóch miejsc. W takim wypadku ten fragment możemy bez problemu wydzielić do osobnej, prywatnej metody. Prywatnej ponieważ sam w sobie nie jest użyteczny w kontekście naszej klasy, jest tylko jednym z etapów dających w rezultacie oczekiwany przez użytkownika wynik:
namespace Kurs { class Test { public int parametr; public int Kwadrat() { int wynik= Licz(); return wynik * wynik; } public int Suma() { int wynik = Licz(); return wynik + wynik; } private int Licz() { return parametr + 2 * (parametr - 4); } } }
5. Parametry metod
Wspomniałem już, że metody mogą działa w oparciu o parametry. No dobra, ale jak one dokładnie wyglądają i działają? Parametry to zmienne, które przechowują dane przekazane do metody. Listę parametrów, jak już wcześniej można było zobaczyć podajemy przy definiowaniu metody jako listę zmiennych oddzielonych przecinkiem, które dostępne będą tylko w obrębie tej jednej metody (a więc różnie metody mogą mieć tak samo nazwane parametry i nic złego się nie stanie).
Poniżej możecie zobaczyć przykład funkcji, która przyjmuje jeden parametr typu int, który jest następnie wykorzystywany do obliczeń:
namespace Kurs { class Test { public int Kwadrat(int x) { return x * x; } } }
Ważne jest aby pamiętać, że jeśli parametr jest typu prostego to przekazując wartość do metody otrzymamy w parametrze jej kopię, która nie wpłynie na oryginał, zaś jeśli parametrem jest referencja do obiektu jakiejś klasy to wykonując na niej operacje wewnątrz metody tak na prawdę działamy na oryginalnym obiekcie. Warto o tym pamiętać, aby zaoszczędzić sobie szukania przyczyny problemu z nagle zmieniającą się wartością w jakimś obiekcie ;) Poniżej macie przykład dwóch metod. Jedna z nich przyjmuje jako parametr typ prosty, zaś druga referencję. Drugi listing pokazuje użycie obu metod i ich wpływ na oryginalne wartości (w komentarzach podałem wartości jakie wyświetlą się na ekranie).
namespace Kurs { class Test { public void Wartosc(int x) { x = x * 2; } public void Referencja(InnaKlasa innaKlasa) { innaKlasa.x = 2; } } }
namespace Kurs { class Program { static void Main(string[] args) { InnaKlasa klasa = new InnaKlasa(); klasa.x = 4; int x = 5; Test test = new Test(); test.Wartosc(x); test.Referencja(klasa); Console.WriteLine(x); // 5 Console.WriteLine(klasa.x); // 2 } } }
I to na tyle w tej części kursu języka C#. Mam nadzieję, że wiedza, która się tutaj znalazła przyda Wam się w drodze do stworzenia własnych programów z wykorzystaniem języka C# i platformy .NET :)
Do tematu metod być może w przyszłości wrócimy, ponieważ na pewno nie wszystko zostało o nich powiedziane. Napiszcie w komentarzach i na Facebooku czy styl i tempo przekazywania wiedzy nadal Wam odpowiada, możecie również pisać o czym chcielibyście poczytać w kolejnych częściach ;) Wszelkie uwagi na pewno przyczynią się do zwiększania jakości moich wypocin. W końcu ten kurs powstaje dla Was więc niech również powstaje z waszym udziałem :)
Dla mnie tempo przekazywania jest Oki znaczy o ilość informacji w ciągu jednej lekcji. Ale mam pytanie może za daleko w przyszłość wybiegam ale czy będzie też kurs z asp.net?;) Głównie mi chodzi o aplikacje bazodanowe zapis,odczyt,edycja bazy, import, export danych
Pozdrawiam
Krzysiek
Zastanawiałem się nad kursem ASP.NET MVC ale nie chcę robić tutaj jakiś deklaracji. Temat co prawda fajny, ale dosyć obszerny. Chociaż ostatnio na facebooku wspomniałem, że możnaby pomyśleć nad jakiś streamem z kodzenia więc może w takiej formie (+ nagrywanie w trakcie dla potomności) bym pokazał jakąś prostą aplikację w ASP.NET.