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 ( … ).
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.
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.