MetodyCzęść NR.7 Metody to bloki kodu, które są wykonywane wtedy, gdy są one wywoływane. óóóó

Jak się można domyślać ta cześć składni języka C# i Javy nie rożni się za bardzo.

Metody są tworzone poprzez określenie:

  • Modyfikatora dostępu. Na razie public. Różnice zostaną omówione później.
  • Parametru zwracanego lub jego braku poprzez słowo kluczowe void
  • Nazwy metody
  • W nawiasach klamrowych deklarujemy listę zmiennych potrzebnych do wywołania metody.

Metody w C# i Javie żyją wewnątrz klas.

class FrankoClass
{
    public void Hello()
    {
        Console.WriteLine("Hello");
    }
}

Obecnie pomijam część określającą dostępność kodu. O tym później.

Wywoływanie metod

Aby wywołać poniższą metodę muszę utworzyć instancję klasy FrankoClass.

Mając w zmiennej instancję klasy mogę przy jej pomocy wywołać metodę.

Operator kropki służy do uzyskania dostępu do elementów danej instancji klasy.

public static void main(String[] args)
{
    FrankoClass f = new FrankoClass();
    f.Hello(); // Hello
}

Parametry Metod

Aby wywołać metodę w nawisach metody musimy podać argumenty zgodnie z jej ciałem.

public void Hello(string s)
{
    Console.WriteLine(s);
}

Obecnie metoda Hello potrzebuje napisu do wykonania.

Teraz metoda potrzebuje dwóch napisów by się wykonać.

void Hello(string s,string a)
{
    Console.WriteLine(s + a);
}

Metoda może mieć w teorii nieskończenie wiele argumentów różnego typu.

void public Hello(string s,string a,int b)
{
    Console.WriteLine(s + a + b);
}

Aby wykonać metodę z parametrami musimy przy jej wywołaniu podać potrzebne argumenty.

public static void main(String[] args)
{
    FrankoClass f = new FrankoClass();
    f.Hello("Moto","Myszy",41); // Hello
}

Wyrażenie return

Metoda może zwracać wartość. Zamiast słowa kluczowego void używamy wtedy typu danych, które chcemy aby były zwrócone.

public string Hello(string s,string a,int b)
{
    return s + a + b;
}

Później wewnątrz metody musimy użyć słowa kluczowego return i zwrócić wartość, która jest określonym typem danej.

Słowo kluczowe return jest wyrażeniem, które sprawia, że wychodzimy z obecnej metody i przechodzimy do kodu, gdzie nasza metoda została wywołana i zwracamy tę wartość.

Słowo kluczowe return może też być używane, gdy metoda niczego nie zwraca. Przydaje się to, gdy chcemy zakończyć działanie metody.

public void Hello(string s,string a,int b)
{
    if (b == 0)
    return;

    Console.WriteLine(s + a);
}

Ten kod nie wyświetli napisu jeśli parametr “b” będzie równy zero.

Przeciążanie metod

Istnieje możliwość zadeklarowania wielu metod o tej samej nazwie tak długo, jak ich liczba parametrów i ich typy są różne.

Nazywa się to przeciążaniem metod.

Najlepszym przykładem w C# przeciążonej metody jest System.Console.WritleLine.

W Javie System.out.print().

Jest to potężna funkcjonalność, która pozwala metodzie na obsłużenie wielu parametrów bez wymagania od programisty używania różnych nazw metod.

public void WriteThis(String s)
{
    System.out.print(s);
}

public void WriteThis(int i)
{
    System.out.print(i);
}

Tylko C# : słowo kluczowe params.

W C# istnieje słowo kluczowe params, w Javie ono występuje jako ( … ).

params Tablica parametrów w metodach

Jak ono działa w C# objaśniłem w tym wpisie.

W Javie odpowiednika params wygląda tak:

public void foo(Object... bars) {
    for (Object bar : bars) {
        System.out.println(bar.toString());
    }
}

Tylko C#: Opcjonalne parametry

W C# 4.0 istnieje możliwość zadeklarowania opcjonalnych parametrów poprzez podanie ich domyślnej wartości w deklaracji metody.

Kiedy metoda jest wywoływana, te opcjonalne argumenty mogą zostać przez nas pominięte. Gdy tak się staniej zostaną one uzupełnione domyślnymi wartościami.

namespace ConsoleApplication6
{
    class Program
    {
        void Sum(int i, int j = 0, int k = 0)
        {
            System.Console.Write(i + j + k);
        }

        static void Main(string[] args)
        {
            new Program().Sum(10, 70);
        }
    }
}

W Intellisense Visual Studio oznacza takie parametry nawiasami kwadratowymi.

image

j i k są opcjonalnymi parametrami. Nie podałem wartości parametru k więc domyślnie ma on wartość zero.

Tylko C# nazywanie argumentów

W C# 4.0 pojawiła się także możliwość przesyłania parametrów w innej kolejności do metody.

Aby to zrobić trzeba odwołać się do nazw parametrów.

Jest to przydatne gdyż kolejność parametrów wymusza na nas podanie wcześniejszych parametrów, co kłóciłoby się z poprzednią funkcjonalnością opcjonalnych parametrów.

static void Main(string[] args)
{
    new Program().Sum(10, k: 70);
}

Parametr K został podany mimo, iż jest on ostatni na liście. Parametr J nie został podany, otrzyma on domyślą wartość.

C# i Java parametr są przesyłane jako wartości

W metodzie jeśli prześlemy liczbę do metody to wewnątrz metody będziemy operować na kopii wartości tego typu wartościowego.

Jeśli chodzi o klasy i typy referencyjne w metodzie, możemy zmienić zawartości w niej zapisane. Nie możemy jednak zmienić adresu. Czyli przypisać nowego obiektu do zmiennej podanej w metodzie.

Oto przykład w Javie, który pokazuje, że operujemy na kopii typu wartościowego.

Pokazuje on także, że możemy zawartość obiektu. Wynika to z alokacji w pamięci.

Adresy zmiennych w klasie, czy w metodzie, czy poza nią są zawsze takie same.

public class NotChange {
    
    public static void main(String[] args)
    {
        NotChange n = new NotChange();
        
        int a = 1000; // typ wartościowy
        n.set(a); // wartość jest podana
        System.out.print(a); // 1000
        int[] b = {0}; // typ referencyjny
        n.set(b); // adres jest przesłany
        System.out.print(b[0]); // 999
    }
    
    void set(int a) { a = 999; }
    void set(int[] a) { a[0] = 999; }
}

Oto przykład w C#, który udowadnia, że nie można do zmiennej umieścić nowego adresu czyli obiektu wewnątrz metody.

class Program
{
    void Set(int[] i) { i = new int[] { 999 }; }
    static void Main()
    {
       Program m = new Program();
        int[] x = new int[] { 1000 };
        m.Set(x);
        System.Console.Write(x[0]);
        //1000 
    }
}

Tylko C#: Słowo kluczowe Ref i out

W C# są słowa kluczowe ref i out. Omówiłem je w tym wpisie.

Kurs: Obiektowość w C# : REF OUT Przekazywanie parametrów dla metody : 05