1. Giriş
Təsəvvür elə: telefonla (ya da app-lə, axı XXI əsrdir) pizza sifariş edirsən. Operatora sifarişin parametrlərini deyirsən və operator sənə nəticəni qaytarır: pizza! Operator susursa — acsan və xoşbəxtlik yoxdur.
Funksiyalar da belədir: bəzən onların işi sadəcə nəsə etməkdir, amma çox vaxt istəyirik ki, funksiya əlavə olaraq nəsə faydalı bir nəticə də qaytarsın, üstəlik bu nəticə hər dəfə fərqli giriş veriləndə fərqli ola bilər! Məsələn:
- Funksiya iki ədədin cəmini hesablayır və nəticəni bildirir.
- Funksiya insanın yaşını alır və kateqoriya qaytarır ("uşaq", "böyük", "pensioner").
- Funksiya istifadəçini adla salamlayan gözəl bir sətir formalaşdırır.
Qaytarılan dəyər — funksiyanın öz işinin nəticəsini “çölə ötürmək” üsuludur.
2. Qaytarılan dəyəri olan metodun siqnatrası
Keçən mühazirədə belə bir şablon görmüşdük:
void PrintHello()
{
Console.WriteLine("Salam!");
}
void tipi o deməkdir ki, funksiya heç nə qaytarmır (void "boş", yəni dəyər yoxdur deməkdir).
İndi isə baxaq, nəsə qaytaran funksiya necə görünür:
int Add(int a, int b)
{
// funksiyanın gövdəsi
}
Burada int funksiyanın adından əvvəl yazılıb — bu, qaytarılan dəyərin tipidir. Yəni, əgər funksiya sətir qaytarırsa — string yazırıq, əgər ondalıqdırsa — double və s.
Funksiyanın elan sintaksisi belədir:
<qaytarılan dəyərin tipi> MetodAdi(<parametrlər>)
{
// funksiyanın gövdəsi
}
Fərqli siqnatraların nümunələri:
| Siqnatrası | Nə qaytarır |
|---|---|
|
Tam ədəd |
|
Sətir |
|
Ondalık ədəd |
|
Boolean dəyər |
3. return operatoru: funksiyadan nəticəni necə qaytarmaq olar
Hər şeyin işləməsi üçün təkcə tipi göstərmək kifayət deyil — funksiyanı nəticəni “yuxarıya” göndərməyi də öyrətmək lazımdır. Bunun üçün return operatoru var. Onun köməyi ilə deyirik: bax, bu dəyəri qaytarıram və bu anda funksiya icranı dayandırır (sanki "çölə çıxır").
tip MetodAdi(...)
{
// hansısa hesablamalar
return dəyər;
}
Nümunə:
int Add(int a, int b)
{
int sum = a + b;
return sum; // cəmi funksiyanın nəticəsi kimi göndəririk
}
Vacib qayda: return ilə qaytarılan dəyərin tipi tam olaraq (və ya uyğun) metodun siqnatrasında göstərilən tipə uyğun olmalıdır.
4. Nümunələr: nəsə qaytaran metodlar yazırıq
Gəlin dərhal nümunələrdə baxaq! Bir neçə məşhur halı nəzərdən keçirək.
Nümunə 1: iki ədədin cəmi
int Add(int a, int b)
{
return a + b;
}
// İstifadə:
int result = Add(10, 20);
Console.WriteLine("Cəm: " + result); // Çıxış: Cəm: 30
Nümunə 2: fərdi salamlaşma
string CreateGreeting(string name)
{
return "Salam, " + name + "!";
}
// İstifadə:
string greeting = CreateGreeting("Anna");
Console.WriteLine(greeting); // Çıxış: Salam, Anna!
Nümunə 3: yetkinlik yoxlanışı
bool IsAdult(int age)
{
return age >= 18;
}
if (IsAdult(21))
{
Console.WriteLine("Giriş icazəlidir.");
}
else
{
Console.WriteLine("Bağışlayın, yalnız böyüklər üçün.");
}
// Çıxış: Giriş icazəlidir.
Nümunə 4: qaytarılan dəyər və ifadələrdə istifadə
Console.WriteLine("İki dəfə çox: " + MultiplyByTwo(7));
int MultiplyByTwo(int n)
{
return n * 2;
}
5. Qaytarılan dəyərin tipi: müxtəliflik və özəlliklər
C#-da funksiya istənilən "tip" qaytara bilər (təkcə ədəd, sətir və s. deyil). Bir neçə hal:
- Tam ədədlər: int, long, short — hər şey sadədir.
- Ondalık: double, float, decimal.
- Sətirlər: string.
- Boolean: bool.
- Massivlər: int[], string[] və s.
- Referans tiplər: özün yaratdığın class obyektləri.
- void: xüsusi hal, heç nə qaytarılmır.
Niyə qaytarılan dəyərin tipi bu qədər vacibdir?
Kompilyator ciddi şəkildə nə qaytardığınıza baxır. Əgər int qaytaracağına söz vermisinizsə, amma sətir və ya heç nə qaytarırsınızsa — səhv alacaqsınız. Elə bil sərt bir rəisdir.
Səhv nümunəsi:
int GetNumber()
{
return "42"; // Səhv! int gözlənilirdi, amma string qaytarıldı.
}
6. return operatoru dəyərsiz: void-metodlar üçün
Ədalət naminə, qaytarılan tipi olan metodlarda (məsələn, int, string) return operatoru həmişə qaytarmaq istədiyimiz dəyərlə birlikdə olmalıdır.
Amma! Əgər funksiya void tipi ilə elan olunubsa, istəsən return operatorunu dəyərsiz də istifadə edə bilərsən — funksiyanın icrasını dərhal dayandırmaq üçün.
void PrintNumbers(int n)
{
if (n <= 0)
{
Console.WriteLine("Ədəd mənfi olmamalıdır!");
return; // Sadəcə funksiyadan çıxırıq, heç nə qaytarmırıq
}
for (int i = 1; i <= n; i++)
{
Console.WriteLine(i);
}
}
Bu, hansısa şərtə görə funksiyanın icrasını dayandırmaq istəyəndə, amma heç nə qaytarmaq lazım olmayanda rahatdır.
7. return istifadə edərkən tipik səhvlər
Ay, nə qədər tez-tez yeni başlayan proqramçılar return ilə bağlı səhvlərdən baş sındırır!
Problem №1: nəsə qaytarmalı olan funksiyada return yoxdur
int GetValue(bool flag)
{
if (flag)
return 1;
// Ayda! Bəs flag == false olsa?
}
// Səhv: kodun bütün yollarında return yoxdur!
Həll: funksiyanın bütün icra ssenarilərində return nəzərdə tut!
int GetValue(bool flag)
{
if (flag)
return 1;
else
return 0;
}
Problem №2: qaytarılan dəyərin tipi uyğun deyil
double GetMagicNumber()
{
return 42; // Əslində, düzgündür (int avtomatik double-a çevrilir)
// Amma funksiya int qaytarsaydı və biz string qaytarsaydıq — səhv olardı!
}
Qayda: tiplərin uyğunluğuna bax. Əmin deyilsənsə — açıq şəkildə tipə çevir:
return (double)42;
Problem №3: vaxtsız return
Bilin ki, return icra olunan kimi metod dərhal dayandırılır. Sonra yazılan heç nə işləməyəcək!
int GetNumber()
{
return 5;
Console.WriteLine("Bu sətir heç vaxt işləməyəcək"); // kompilyator da şikayət edəcək!
}
Problem №4: void-metodda dəyərlə return (qadağandır!)
void PrintSomething()
{
return 1; // void-metoddan dəyər qaytarmaq olmaz!
}
GO TO FULL VERSION