CodeGym /Kurslar /C# SELF /Lokal funksiyalar

Lokal funksiyalar

C# SELF
Səviyyə, Dərs
Mövcuddur

1. Giriş

Hər bir proqramçı bilir: funksiyalar (və ya metodlar) — əslində hər bir tətbiqin "işçi atları"dır. Onlar bizə kodu strukturlaşdırmağa, məntiqi təkrar istifadə etməyə və sonsuz copy-paste-lərdə batmamağa kömək edir. İndiyə qədər işlədiyin bütün funksiyalar class və ya struct-un daxilində "qonşu" olublar.

Amma təsəvvür elə ki, sənin böyük bir funksiyan var və içində elə də böyük olmayan bir məntiq parçası var, onu bir az səliqəli şəkildə ayırmaq istəyirsən, amma bütün layihəyə göstərmək istəmirsən. Məsələn, metodun içində köməkçi bir hesablamadır və başqa heç yerdə lazım deyil.

Belə hallarda lokal funksiyalar köməyə gəlir.

Lokal funksiya — başqa bir funksiyanın (metodun, konstruktorun, property-nin və ya hətta başqa lokal funksiyanın) içində elan olunan funksiyadır. Belə lokal funksiya yalnız "valideyninə" görünür və başqa heç yerdə istifadə oluna bilmir.

Lokal funksiyaların sintaksisi


void MainMethod()
{
    Console.WriteLine("Əsas metodun başlanğıcı.");            // Əsas metodun işə başlaması.
    int result = InnerSum(5, 7);                              // Lokal funksiya InnerSum-un çağırılması (daxili cəmləmə)
    Console.WriteLine($"Lokal funksiyanın nəticəsi: {result}");    // Lokal funksiyanın nəticəsi: {result}

    // Lokal funksiya birbaşa MainMethod-un içində elan olunur
    
  
int InnerSum(int a, int b) // İki ədədin cəmini hesablamaq üçün lokal funksiya { return a + b; // a və b-nin cəmini qaytarır }
}

Bu nümunədə InnerSum funksiyası birbaşa MainMethod metodunun içində elan olunub. O, əsas metodun xaricində heç bir yerdə görünmür — heç cür! Sanki gizli bir təlimatdır, yalnız təkbətək paylaşmaq olar.

2. Lokal funksiyanı necə elan etmək və harada istifadə etmək olar

Əsas qaydalar

  • Lokal funksiya aşağıdakılarda elan oluna bilər: metod, konstruktor, property, operator və ya hətta başqa lokal funksiya!
  • Lokal funksiya yalnız öz görünürlük sahəsində (scope) istifadə oluna bilər.
  • Lokal funksiyaları valideyn funksiyada elan olunmazdan əvvəl və ya sonra çağırmaq olar (C# hər şeyi əvvəlcədən analiz edir).

Nümunə: orta qiymətin hesablanması


// Orta qiyməti çap etmək üçün əsas funksiya
void PrintAverageScore(int[] scores)
{
    if (scores.Length == 0)
    {
        Console.WriteLine("Hesablamaq üçün qiymət yoxdur."); // Hesablamaq üçün qiymət yoxdur.
        return;
    }

    double average = CalculateAverage(scores);
    Console.WriteLine($"Orta qiymət: {average:0.00}"); // Orta qiymət

    // Orta qiyməti hesablamaq üçün lokal funksiya
    
  
double CalculateAverage(int[] arr) { int sum = 0; foreach (var score in arr) sum += score; return (double)sum / arr.Length; // Orta qiyməti qaytarır }
} // Funksiyanın çağırılması: int[] myScores = { 5, 4, 3, 4, 5 }; PrintAverageScore(myScores); // Çap edəcək: Orta qiymət: 4.20

Gördün necə rahatdır? PrintAverageScore-un xaricində heç kim onun daxili məntiqindən — lokal CalculateAverage funksiyasından istifadə edə bilmir. Belə yanaşma kodu səliqəli saxlamağa və köməkçi metodlarla qlobal ad məkanını çirkləndirməməyə kömək edir.

3. Lokal funksiyalar və görünürlük sahəsi (scope)

Lokal funksiyanın əsas fəndi — onun görünürlük sahəsi yalnız "valideyn" metodla məhdudlaşır. Bu davranış class-ı yalnız bir yerdə istifadə olunan xırda metodlarla "çirkləndirməyə" imkan vermir.


+-----------------+
|   Klass metodu  |
|    void Foo()   |
|                 |
|   +-----------+ |
|   |  Lokal    | |
|   |  funksiya | |
|   +-----------+ |
+-----------------+
Lokal funksiya yalnız elan olunduğu metodun içində mövcuddur

Lokal funksiya yalnız elan olunduğu metodun içində mövcuddur. Onu xaricdən çağırmağa cəhd etmək, sanki səndə olmayan gizli xəttə zəng etməyə bənzəyir.

Əgər təsadüfən lokal funksiyanı valideyn metodun xaricində çağırmağa çalışsan, belə bir səhv alacaqsan: '...' adı cari kontekstdə mövcud deyil.

Lokal funksiyalar valideynin dəyişənlərini görə bilir

Lokal funksiyalar valideyn metodun bütün dəyişənlərinə müraciət edə bilir — məhz bu onların super gücüdür!


void ShowStudent(string name, int age)
{
    string message = BuildMessage();
    Console.WriteLine(message);

    // Lokal funksiya "name" və "age" dəyişənlərindən istifadə edir
    
  
string BuildMessage() { return $"Ad: { name}, Yaş: { age}"; }
}

Bu kodu təkcə qısa yox, həm də daha "sakit" edir. Hər metoda onlarla parametr ötürməyə ehtiyac yoxdur — lokal funksiya valideyndə olan hər şeyi "görür".

4. Lokal funksiyalar dövr və şərtlərin içində

Lokal funksiyaları istənilən dərinlikdə elan etmək olar — hətta dövrün və ya şərtin içində də:


void ProcessNumbers(int[] numbers)
{
    foreach (int number in numbers)
    {
        if (number % 2 == 0)
        {
            Console.WriteLine($"{number} — cüt");
            PrintEvenMessage();
        }
        else
        {
            Console.WriteLine($"{number} — tək");
        }

        
  
void PrintEvenMessage() { Console.WriteLine("Bu cüt ədəddir, təbrik edirik!"); }
} }

Amma belə yanaşma kodu tez bir zamanda oxunmaz edə bilər, xüsusən lokal funksiyalar çoxalanda və ya onlar uzun olanda. Həddindən artıq istifadə etmək lazım deyil, amma belə imkanın olduğunu bilmək faydalıdır.

Lokal funksiya vs adi private metod

Kriteriya Lokal funksiya Class-ın private metodu
Görünürlük sahəsi Yalnız valideyn funksiya Bütün class
Valideyn dəyişənlərinə çıxış Bəli Xeyr (yalnız parametrlərlə)
Oxunaqlığın sadələşdirilməsi Yüksək Orta
Təkrar istifadə potensialı Aşağı Yüksək
Test oluna bilmə Test etmək çətindir Test etmək asandır

5. Tipik səhvlər və reallaşdırma xüsusiyyətləri

Səhv №1: lokal funksiyanın adında səhv və ya elanını unutmaq.
Əgər lokal funksiyanı səhv adla çağırırsansa və ya onu elan etməyi unudursansa, compiler CS0103 və ya CS0128 səhvini göstərəcək və kod kompilyasiya olunmayacaq.

Səhv №2: tutulan dəyişənlərin (closure) dəyişdirilməsi.
Lokal funksiya xarici metoddan olan dəyişənin dəyərini dəyişəndə, gözləmədiyin nəticə ala bilərsən — tutulan dəyişənlər bəzən kopya, bəzən isə istinad kimi işləyir və onların dəyişməsi məntiqə təsir edir.

Səhv №3: IDE-nin private metodları lokal funksiyaya çevirmə təkliflərini görməməzlikdən gəlmək.
Əgər class-da artıq lazım olmayan private metodlar saxlayırsansa, halbuki IDE (məsələn, Rider) onları lokal funksiya etməyi təklif edir, kodda tez bir zamanda "zibil" toplanır və oxunaqlıq azalır.

Səhv №4: lokal funksiyaların həddindən artıq dərin iç-içə yerləşməsi.
Çoxlu səviyyədə iç-içə lokal funksiyalar kodun başa düşülməsini və debug edilməsini çətinləşdirir. Qısa və aydın kod — rahat dəstək üçün açardır.

2
Tapşırıq
C# SELF, səviyyə, dərs
Bağlanıb
İki ədədin cəmini hesablamaq üçün lokal funksiyadan istifadə
İki ədədin cəmini hesablamaq üçün lokal funksiyadan istifadə
2
Tapşırıq
C# SELF, səviyyə, dərs
Bağlanıb
Ədədin tək və ya cüt olmasını yoxlamaq üçün lokal funksiya
Ədədin tək və ya cüt olmasını yoxlamaq üçün lokal funksiya
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION