W poniższym poście poruszymy temat metod. Od definicji przez wywołanie do parametrów.
Co to jest metoda?
Metoda jest przede wszystkim blokiem kodu, ale w głównej mierze to grupa poleceń, która ma za zadanie wykonać określone działanie. Każdy program w języku C# zawiera co najmniej jedną klasę z metodą główną, która nazywa się Main().
Mamy dwie możliwości użycia metody należy ją:
- zdefiniować;
- wywołać.
Definiowanie metod
Kiedy zaczniemy definiować metody, w pierwszej kolejności należy określić składniki struktury tej metody bez których metoda nie zadziała a kompilator zwróci błąd.
Składnia:
1 2 3 4 |
modyfikator_dostepu zwracany_typ nazwa_metody (lista_parametrów) { wnętrze_metody } |
Poniżej opis składowych struktury metod:
- modyfikator_dostępu – definiuje widoczność zmiennej lub metod;
- zwracany_typ – metoda może zwracać wartość. Typ ten określa jaki rodzaj wartości zostanie zwrócony. Jeżeli metoda nie zwraca określonej wartości, to typem zwracanym jest void;
- nazwa_metody – nazwa metody jest unikatowa oraz ważna jest wielkość liter (case sensitive). Nazwa taka nie może być identyczna z pozostałmi identyfikatorami zdefniowanymi w klasie;
- lista_parametrów – parametry umieszczone są w nawiasie. Pozwalają one na przekazywanie oraz zwracanie danych z metody. Lista parametrów danej metody odnosi się do typu, kolejności oraz liczby parametrów w metodzie. Parametry są opcjonalne, metoda nie musi ich zawierać w swojej definicji;
- wnętrze_metody – zawiera zestaw poleceń niezbednych do wykonania określonego działania.
Przykład:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class GreaterNumber { public int FindMax(int a, int b) { // local declaration of returned type int score; if (a > b) score = a; else score = b; return score; } } |
Powyższy przykład pokazuję metodę FindMax(), która przyjmuje dwie wartości całkowite oraz zwraca większą z nich. Modyfikator dostępu metody to public, dzięki czemu mam do niej dostęp z zewnątrz klasy używając instancji tej klasy.
Wywoływanie metod
Metoda może zostać wywołana przy użyciu jej nazwy.
Poniższy przykład pokazuje takie wywołanie:
Przykład:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System; namespace Methods { class Program { static void Main(string[] args) { // Definition of local variable int a = 23; int b = 212; int score_comarision; GreaterNumber wbl = new GreaterNumber(); score_comarision = wbl.FindMax(a, b); Console.WriteLine("Greater number is: {0}", score_comarision ); Console.ReadKey(); } } public int FindMax(int a, int b) { // local declaration of returned type int score; if (a > b) score = a; else score = b; return score; } } |
Rekurencyjne wywoływanie metod
Metoda może wywoływać się sama. Zachowanie takie to rekurencja.
Poniższej przykład obliczający silnię danej liczby używając do tego rekurencyjnego wywołania metody.
Przykład:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
using System; namespace Methods { Public class Recursion { static void Main(string[] args) { Factorial fc = new Factorial(); Console.Write("Factorial of number 6 to : {0}", fc.ComputeFactorial(6)); Console.ReadKey(); // The result of the program // Factorial of number 6 to : 720 } class Factorial { private int number; public int ComputeFactorial(int liczba) { int score; if (number == 1) return 1; else { score = ComputeFactorial(number - 1) * number; return score; } } public Factorial(int number) { this.number = number; } } } |
Przekazywanie parametrów do metod
Podczas wywoływania metody z parametrami najpierw te parametry należy przekazać do metody.
Poniżej trzy rodzaje parametrów, które można przekazać do metody:
- Parametry typu wartościowego (value parameters) – to parametry które możemy skopiować wartość argumentu i przekazać w formie parametru do wnętrza metody. W tym przypadku zmiany parametru dokonane wewnątrz funkcji nie wpływają na argument. Co to znaczy? to oznacza że do metody przekazaliśmy jedynie kopię tej wartości. i każda zmiana wykonywana na niej nie wpływa na zmianę parametru, który przekazaliśmy do metody;
- Parametry typu referencyjnego (reference parameters) – to parametry które są odniesieniem do parametru w postaci adresu w pamięci, które przekazujemy do wnętrza funkcji. Czyli w tym przypadku każda zmiana wprowadzona wewnątrz funkcji wpływa na wartość argumentu;
- Parametry typu wyjściowego (output parameters) – to parametry które umożliwiają na zwrócenie więcej niż jednej wartości.
Parametry typu wartościowego
Jest to domyślny sposób przekazywania parametrów do metody. Kiedy metoda jest wywoływana, nowa komórka w pamięci jest tworzona dla każdego przekazywanego parametru.
Wartości aktualnych parametrów przekazywane są do wspomnianych wyżej komórek pamięci. W związku z tym, zmiany na parametrach wewnątrz metody nie mają wpływu na wartość argumentów przekazywanych do tej metody.
Omówmy działanie na poniższym przykładzie:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
using System; namespace ValuesTypeMethods { public class Program { static void Main(string[] args) { OperationsOnNumber onl = new OperationsOnNumber(); int a = 100; int b = 200; Console.WriteLine("Wartość a przed zamianą: {0}", a); Console.WriteLine("Wartość b przed zamianą: {0}", b); // Call the reverse order method onl.ChangeOrder(a, b); Console.WriteLine("Wartość a po zmianie: {0}", a); Console.WriteLine("Wartość b po zmianie: {0}", b); Console.ReadKey(); // Result // Value a before change: 100 // Value b before change: 200 // Value after change: 100 // Value b after change: 200 } public class OperationsOnNumber { public void ChangeOrder(int x, int y) { int temporary; temporary = x; // assigning the value of variable x x = y; // assigning the value of y to the variable x y = temporary; // assigning the value of variable x to variable y } } } } |
Parametry typu referencyjnego
Parametr referencyjny to nic innego jak odniesienie do adresu w pamięci wskazanego parametru. W momencie przekazywania parametru przez referencje, w odróżnieniu od typu wartościowego, nie jest tworzona nowa komórka w pamięci. Parametr referencyjny ma dokładnie takie samo odniesienie, czyli referencje do miejsca w pamięci co aktualnie używany parameter.
Parametr referencyjny definiujemy poprzez użycie słowa kluczowego ref.
Omówmy działanie na poniższym przykładzie (Użyjemy do tego znany nam już przykład z Parametrów wartościowych – lekko modyfikując).
Przykład:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
using System; namespace ReferenceTypeMethods { class Program { static void Main(string[] args) { OperationOnNumbers onl = new OperationOnNumbers(); int a = 25; int b = 50; Console.WriteLine("Wartość a przed zamianą: {0}", a); Console.WriteLine("Wartość b przed zamianą: {0}", b); // Call the reverse order method onl.ChangeQueue(ref a, ref b); Console.WriteLine("Wartość a po zmianie: {0}", a); Console.WriteLine("Wartość b po zmianie: {0}", b); Console.ReadKey(); // The result of the program // The value before the conversion: 25 // The value of b before conversion: 50 // The value after the change: 25 // The value of b after the change: 50 } } internal class OperationOnNumbers { public void ChangeQueue(ref int x, ref int y) { int transient; transient = x; // assign the value of the variable x x = y; // assigning the y value in place of the x variable y = transient; // assigning the value of x to the variable y } } |
Powyżej zaprezentowałęm przykłąd, który zmienia wartości wewnątrz metody, mające wpływ na zmienne przekazne, jako parametry typu referencyjnego tej metody.
Parametry typu wyjściowego
Instrukcja return powala na zwrócenie tylko jednej wartości z metody. Jednak, przy użyciu parametrów wyjściowych, możemy zwrócić większą liczbę takich wartości. Parametry wyjściowe podobne są do typów referencyjnych, z jedną ważną różnicą, otóż parametry wyjściowe zwracają dane z metody, kiedy parametry referencyjne przekazują dane do metody.
Parametr wyjściowy jest definiowany przez użycie słowa kluczowego out.
Do omówienia parametrów wyjściowych ponownie użyjemy znanego nam przykładu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
using System; namespace OutputTypeMethods { class Program { static void Main(string[] args) { OperationOnNumbers oon = new OperationOnNumbers(); int a = 350; Console.WriteLine("The number before calling the method: {0}", a); // Calling the method oon.DownloadValue(out a); Console.WriteLine("The number after calling the method: {0}", a); Console.ReadKey(); // The result of the program // Number before calling the method: 350 // Number after calling the method: 45 } } internal class OperationOnNumbers { public void DownloadValue(out int x) { int transient = 45; x = transient; } } |
Co warto zapamiętać?
Pamiętajmy że zmienna, którą chcemy zwrócić, wcale nie musi mieć przypisanej wartości. Parametry wyjściowe wykorzytujemy w kodzie, kiedy musimy zwrócić z metody parametry tak aby nie musiały mieć przypisanej początkowej wartości a na przykład wskarzemy podczas wykonywania naszego programu. Aby to łatwiej zrozumieć posłuże się naszym przykładem, po krótce modyfikując nasz kod.
Przykład:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System; namespace MetodyTypyWyjsciowe { class Program { static void Main(string[] args) { OperationOnNumbers oon = new OperationOnNumbers(); // Definition of local variables int a, b; // calling the method returning parameters oon.DownloadValuei(out a, out b); Console.WriteLine("The value of the number a after calling the method: {0}", a); Console.WriteLine("The value of the number b after calling the method: {0}", b); Console.ReadLine(); } } internal class OperationOnNumbers { public void DownloadValue(out int x) { Console.WriteLine("Enter the first value: "); x = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Enter the second value: "); y = Convert.ToInt32(Console.ReadLine()); } } } |
Pytania? sugestie? piszcie komentujcie.
Oczywiście cały Przykłady dostępne na GitHubie.
Witam chciałem tylko powiedzieć, że strona bardzo
długo się wczytuje.
Hej,
być może dlatego, że nie miałem ostatnio czasu aby zrobić update WP.
już nie długo wrócę do bloga, i przeprowadzę modernizację. Mam nadzieje że strona wtedy będzie szybciej działac.
Pozdrawiam.