Məzmuna keç
Educora
Başlanğıc18 dəq5 / 16

Metodlar: parametrlər, qaytarılan qiymət, ref və out

Öz metodlarını yaz: parametrlər, `return`, qısa `=>` yazılışı, susmaya görə və adlı arqumentlər, kortejlər, `ref` və `out`.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • Parametrli metod təyin etmək və onu çağırmaq
  • return ilə nəticə qaytarmaq və void metodlardan fərqini izah etmək
  • Susmaya görə qiymətli parametrlərdən və adlı arqumentlərdən istifadə etmək
  • Qiymətlə ötürməni ref və out ilə ötürmədən fərqləndirmək

Proqramının beş yerində endirimli qiyməti hesablayırsan və hər dəfə eyni üç sətri köçürürsən. Sonra düsturda səhv tapırsan — indi onu beş yerdə düzəltmək lazımdır! Metodlar bu problemi həll edir: kod bir dəfə yazılır, ad alır və istənilən qədər çağırılır. Console.WriteLine, int.Parse və string.Join artıq tanıdığın metodlardır — indi öz metodlarını yazacaqsan.

Metodu təyin etmək və çağırmaq

Metodun başlığında əvvəlcə qaytarılan tip, sonra ad, mötərizədə isə tipləri ilə birlikdə parametrlər yazılır. void metodun heç nə qaytarmadığını bildirir. Üst səviyyəli əmrlərlə yazılan proqramda metodlar adətən faylın sonunda yerləşdirilir, amma onları yuxarıdan da çağırmaq olar. Metod adları böyük hərflə başlayır: Greet, CalculateTotal.

C#
Greet("Aysel");
Greet("Murad");

void Greet(string name)
{
    Console.WriteLine($"Salam, {name}!");
}
Gözlənilən nəticə
Salam, Aysel!
Salam, Murad!
Tərif
Parametr və arqument

Parametr metodun başlığında elan olunan dəyişəndir (string name). Arqument metod çağırılanda həmin parametrə verilən konkret qiymətdir ("Aysel").

return: nəticəni qaytarmaq

Metod nəticə qaytarırsa, void əvəzinə nəticənin tipi yazılır, gövdədə isə return işlədilir. return metodun işini dayandırır və qiyməti çağırış yerinə göndərir. Gövdəsi bir ifadədən ibarət olan metodu qısaca => oxu ilə yazmaq olar.

C#
double area = RectangleArea(4, 3.5);
Console.WriteLine($"Room area: {area}");
Console.WriteLine(IsEven(10));
Console.WriteLine(CelsiusToFahrenheit(25));

double RectangleArea(double width, double height)
{
    return width * height;
}

bool IsEven(int n) => n % 2 == 0;

double CelsiusToFahrenheit(double c) => c * 9 / 5 + 32;
Gözlənilən nəticə
Room area: 14
True
77

Susmaya görə qiymətlər və adlı arqumentlər

Parametrə susmaya görə qiymət vermək olar: çağırışda arqument buraxılsa, həmin qiymət işlədilir. Belə parametrlər siyahının sonunda yazılır. Arqumentləri adları ilə də vermək olar — discount: 10 — onda onların sırası vacib deyil və çağırışın mənası dərhal aydın olur.

C#
Console.WriteLine(FinalPrice(80));
Console.WriteLine(FinalPrice(80, 25));
Console.WriteLine(FinalPrice(discount: 10, price: 50));

PrintTicket("Leyla");
PrintTicket("Elvin", seats: 3);

decimal FinalPrice(decimal price, int discount = 0)
{
    return price - price * discount / 100;
}

void PrintTicket(string name, string city = "Baku", int seats = 1)
{
    Console.WriteLine($"{name}: {seats} seat(s) in {city}");
}
Gözlənilən nəticə
80
60
45
Leyla: 1 seat(s) in Baku
Elvin: 3 seat(s) in Baku
seats: 3 adla verildiyi üçün city parametrini buraxmaq mümkün oldu.

Bir neçə nəticə: kortejlər, ref və out

Metod bir neçə qiyməti birdən kortej (tuple) şəklində qaytara bilər: qaytarılan tip mötərizədə yazılır, məsələn, (int Min, int Max). Çağırışda korteji dərhal ayrı dəyişənlərə ayırmaq olar:

C#
int[] temperatures = [12, 5, 27, 9];
var (low, high) = MinMax(temperatures);
Console.WriteLine($"Min: {low}, max: {high}");

(int Min, int Max) MinMax(int[] numbers)
{
    int min = numbers[0];
    int max = numbers[0];
    foreach (int n in numbers)
    {
        if (n < min) min = n;
        if (n > max) max = n;
    }
    return (min, max);
}
Gözlənilən nəticə
Min: 5, max: 27

Arqumentlər susmaya görə qiymətlə ötürülür: metod qiymətin surətini alır və onu dəyişsə də, çağıran tərəfdəki dəyişən dəyişmir. ref açar sözü dəyişənin özünü ötürür — metod onu dəyişə bilər. out isə nəticəni çıxarmaq üçündür: metod out parametrinə mütləq qiymət yazmalıdır. ref və out həm metodun başlığında, həm də çağırışda yazılır.

C#
int score = 10;
AddBonusCopy(score);
Console.WriteLine($"After copy: {score}");
AddBonus(ref score);
Console.WriteLine($"After ref: {score}");

Divide(17, 5, out int quotient, out int remainder);
Console.WriteLine($"17 / 5 = {quotient}, remainder {remainder}");

if (int.TryParse("42", out int number))
    Console.WriteLine($"Parsed: {number}");
if (!int.TryParse("forty", out _))
    Console.WriteLine("'forty' is not a number");

void AddBonusCopy(int value) => value += 5;

void AddBonus(ref int value) => value += 5;

void Divide(int x, int y, out int q, out int r)
{
    q = x / y;
    r = x % y;
}
Gözlənilən nəticə
After copy: 10
After ref: 15
17 / 5 = 3, remainder 2
Parsed: 42
'forty' is not a number
  • AddBonusCopy yalnız surəti dəyişdi, ona görə score 10 olaraq qaldı.
  • ref ilə metod dəyişənin özünü aldı və onu 15 etdi.
  • int.TryParse out ilə işləyir: çevirmə alınarsa, true qaytarır və ədədi yazır, alınmazsa xəta atmadan false qaytarır. out _ nəticənin lazım olmadığını bildirir.

Əsas fikirlər

  • Metodun başlığı: qaytarılan tip, ad, parametrlər — double Area(double w, double h).
  • void metod heç nə qaytarmır; digərləri return ilə qiymət qaytarır.
  • Bir ifadəlik metodu => ilə qısa yazmaq olar.
  • Susmaya görə qiymətlər (int discount = 0) arqumenti istəyə bağlı edir, adlı arqumentlər (seats: 3) sıranı sərbəst edir.
  • Arqumentlər susmaya görə surət kimi ötürülür; ref dəyişənin özünü verir, out isə nəticəni çıxarır.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
void qaytarılan tipi nə deməkdir?