- Parametrli metod təyin etmək və onu çağırmaq
returnilə nəticə qaytarmaq vəvoidmetodlardan 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
refvəoutilə ö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.
Greet("Aysel");
Greet("Murad");
void Greet(string name)
{
Console.WriteLine($"Salam, {name}!");
}Salam, Aysel! Salam, Murad!
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.
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;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.
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}");
}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:
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);
}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.
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;
}After copy: 10 After ref: 15 17 / 5 = 3, remainder 2 Parsed: 42 'forty' is not a number
AddBonusCopyyalnız surəti dəyişdi, ona görəscore10 olaraq qaldı.refilə metod dəyişənin özünü aldı və onu 15 etdi.int.TryParseoutilə işləyir: çevirmə alınarsa,trueqaytarır və ədədi yazır, alınmazsa xəta atmadanfalseqaytarı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). voidmetod heç nə qaytarmır; digərlərireturnilə 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;
refdəyişənin özünü verir,outisə nəticəni çıxarır.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.
void qaytarılan tipi nə deməkdir?