Menu

C# podstawy część 4 metody

27 kwietnia 2016 - blog, C#, kurs
C# podstawy część 4 metody

Deklarowanie metod

Możliwość definiowania i wywoływania metod jest fundamentalnym komponentem programowania obiektowego, ponieważ metody pozwalają na zamknięcie operacji, które chronią dane w nich przechowywane.

Zazwyczaj, każda aplikacja, którą tworzysz używając framework Microsoft .NET oraz Visual C# będzie miała wiele metod, każdą ze sprecyzowanym przeznaczeniem. Niektóre metody są fundamentalne dla działania programu. Na przykład wszystkie aplikacje desktopowe w C# musza mieć metodą nazywającą się Main, która definiuje punkt wejściowy aplikacji. Gdy użytkownik uruchomi aplikację C#, komputer (CLR) uruchomi właśnie tą metodę.

Metody mogą być przeznaczone do użytku wewnętrznego przez dany typ, i wtedy są one nie widoczne dla innych typów. Metody publiczne mogą być zdefiniowane aby inne typy mogły spowodować, aby obiekt wykonał jakąś akcję, są one więc widoczne na zewnątrz swojego typu. 

Framework .NET sam jest zbudowany z klas, które upubliczniają metody, które możesz wywołać w swojej aplikacji aby stworzyć interakcję między użytkownikiem a komputerem. 

Metoda jest deklarowana przez użycie sygnatury metody oraz ciała metody.

Sygnatura odpowiada za dostarczenie modyfikatora dostępu, typu zwracanego przez metodę, nazwy metody oraz listy parametrów.

Ciało metody zawiera implementację tego co metoda ma robić. Każdy ze składników sygnatury metody przedstawiono poniżej:

  • Modyfikator dostępu - używany aby kontrolować dostępność metody (skąd może być wywołana)
    • private - najbardziej restrykcyjny, pozwala na wywołanie metody tylko z zawierającej ją klasy lub struktury
    • public - najmniej restrykcyjny, pozwalający na dostęp do metody z każdego miejsca programu
    • protected - pozwala na dostęp do metody z klasy zawierającej i z klas dziedziczących
    • internal - dostępne z plików w tym samym assembly
    • static - wskazuje, że metoda jest członkiem statycznym klasy a nie członkiem instancji jakiegoś obiektu
  • Typ zwracany - wskazuje jaki typ danych metoda zwróci. Użyj void jeśli metoda nie zwraca żadnych danych.
  • Nazwa metody - wszystkie metody potrzebują nazwy, abyś wiedział co masz wywołać w swoim kodzie.
  • Lista parametrów - oddzielona przecinkami lista parametrów przyjmujących argumenty.

Przykładowa metoda: 

public int IleSamoglosek(string wyraz)
{

   // kod obliczający ilość samoglosek

} 

 W powyższym przykładzie, public to modyfikator dostępu, int to typ zwracany, IleSamoglosek to nazwa metody, a string wyraz to lista parametrów. Zauważ, że lista parametrów określa typ danych oraz nazwę parametru).

Wywoływanie metody

Metodę wywołujesz aby wywołać kod w niej zawarty z jakiegoś miejsca w programie. Nie musisz rozumieć, jak kod w metodzie pracuje. Nie musisz nawet mieć dostępu do kodu, jeśli metoda znajduje się w bibliotece do której nie masz kodu źródłowego. 

Aby wywołać metodę określasz nazwę metody i dostarczasz argumenty, które korespondują z parametrami w nawiasach. 

Poniższy kod pokazuje jak wywołać metodę Szyfruj, dostarczając zmienne string oraz int  aby spełnić wymagania określone sygnaturą metody. 

// deklaracja metody
string Szyfruj(string zdanie, int kodSzyfrujacy)
{
   // Tu przetwarzamy dane
}

// deklarujemy dane wejściowe
string wyraz = "alibaba";
int kodSzyfujacy = 13324;

// wywołanie metody, dane wyjściowe musimy przypisać do zmiennej
// tego samego typu co opisany w sygnaturze metody
string wyrazZaszyfrowany = Szyfruj(wyraz, kod);        

Zwracanie danych

Jeśli metoda zwraca jakąś wartość, określasz w jaki sposób się nią zająć, zazwyczaj przypisując ją do zmiennej.

Poniższy kod pokazuje jak przechwycić zwracaną wartość metody  GetServiceName  do zmiennej  serviceName.

string GetServiceName()
{
   return "FourthCoffee.SalesService";
}

string serviceName = GetServiceName();

 Powyższy przykład pokazuje zwracanie pojedynczej wartości z metody. Czasem może okazać się że chciałbyś zwrócić kilka wartości. Są trzy sposoby, dzięki którym możesz to osiągnąć:

  • 1. Zwrócić listę z danymi
  • 2. Użyć słowo kluczowe ref
  • 3. Użyć słowo kluczowe out

W tym przykładzie, wywołujemy metodę  ReturnMultiOut .  Parametry tej metody używają słówka kluczowego out  aby oznajmić, że wartości będą zwrócone dla tych parametrów. Zwróć uwagę, że nie wywołujemy tej metody z przypisaniem do zmiennej jak w poprzednim przykładzie z GetServiceName()

static void ReturnMultiOut(out int i, out string s)
{

    i = 25;
    s = "using out";

}

ReturnMultiOut(out first, out sValue);

Console.WriteLine("{0}, {1}", first.ToString(), sValue);

W następnym przykładzie, używamy słówka ref aby zwrócić kilka wartości z metody. Z reguły użycie ref wymaga aby zmienne, które są używane były wcześniej zainicjalizowane.

static void ReturnMultiRef(ref int i, ref string s)
 {

        i = 50;
        s = "using ref";

 }

// Uzycie ref

sValue = "";

ReturnMultiRef(ref first, ref sValue);

Console.WriteLine("{0}, {1}", first.ToString(), sValue);

Przeciążanie metod

Gdy definiujesz metodę, możesz uświadomić sobie, że wymaga ona innego zestawu informacji w różnych okolicznościach. Możesz zdefniować przeciążone metody aby stworzyć wiele metod z tą samą funkcjonalnością, akceptujące różne parametry w zależności od kontekstu w którym są wywoływane.

Metody przeciążone mają tą samą nazwę, aby pokazać, że mają współny cel. Jednak metody przeciążone muszą mieć różne sygnatury, aby odróżnić je od pozostałych metod w danej klasie.

Sygnatura metody zawiera jej nazwę oraz listę parametrów. Typ zwracany nie jest częścią sygnatury, dlatego nie możesz stworzyć metod przeciążonych, które różnią się tylko typem który zwracają. Nie możesz również tworzyć metod przeciążonych, różniących się kolejnością parametrów.

Poniższy kod prezentuje trzy wersje metody StopService, wszystkie o unikalnych sygnaturach.

void StopService()
{
   // Ta metoda nie przyjmuje argumentów
}

void StopService(string serviceName)
{
   // Ta metoda przyjmuje tylko jeden argument typu string
}

void StopService(int serviceId)
{
   // Ta metoda przyjmuje jeden argument typu int
}

Gdy wywołasz metodę StopService,  masz wybór, której przeciążonej metody użyć. Po prostu dostarczasz odpowiedni argument aby spełnić którąś z sygnatur, a dalej kompilator sam określi, którą metodę użyć na podstawie dostarczonych przez ciebie argumentów.

Parametry opcjonalne

Parametry opcjonalne

Kluczową możliwością Visual C# jest współpraca z aplikacjami i komponentami, które są napisane przy użyciu innych technologii. Jedną z podstawowych technologii, którą używa Windows jest Component Object Model (COM - komponentowy model obiektu). COM nie wspiera metod przeciążonych, ale zamiast tego używa metod, które mogą przyjąć opcjonalne parametry. Aby ułatwić używanie bibliotek i komponentów COM, C# również wspiera parametry opcjonalne. 

Parametry opcjonalne są przydatne również w innych sytuacjach. Dostarczają prostego rozwiązania gdy nie jest możliwe użycie metod przeciążonych, ponieważ typy parametrów nie różnią się tak, aby kompilator mógł te metody rozróżnić. Definiując metodę z parametrami opcjonalnymi istotne jest, abyś umieścił parametry wymagane na początku listy, a dopiero potem parametry opcjonalne. 

Poniższy przykład pokazuje jak zdefiniować metodę przyjmującą jeden parametr wymagany (forceStop) i dwa parametry opcjonalne (serviceName, serviceID).  Zwróć uwagę, że mechanizm użyty do określenia parametru opcjonalnego wskazuje na jego wartość domyślną.

void StopService(bool forceStop, string serviceName = null, int serviceId = 1)
{
   // kod zatrzymujacy usluge 
}

Możesz wywołać metodę z parametrami opcjonalnymi dokładnie tak samo jak każdą inną metodę. Określasz nazwę metody i dostarczasz wszystkie wymagane argumenty. Różnica w metodach z parametrami opcjonalnymi polega na tym, że możesz ominąć opcjonalne parametry, a metoda użyje wartości domyślnych do swoich obliczeń.

Parametry nazwane

Tradycyjnie, wywołując metodę, kolejność i pozycja argumentów ściśle koresponduje z porządkiem parametrów w sygnaturze metody. Jeśli argumenty są nie po kolei i typy się różnią, to otrzymasz błąd kompilatora.  

W Visual C#, możesz określić parametry po nazwie, i tym sposobem dostarczyć je w kolejności innej niż w sygnaturze metody. Aby użyć parametru nazwanego, podajesz nazwę parametru z dwukropkiem oraz wartość. Poniższy przykład pokazuje jak wywołać metodę StopService podając nazwany parametr serviceID . 

StopService(true, serviceID: 1);

 Pamiętaj: musisz zawsze użyć parametrów wymaganych na początku, jeśli nie używasz ich jako parametry nazwane!