Sobes.tech
Middle

Kompilyatsiyadan so'ng using direktivasi qanday ko'rinadi?

sobes.tech AI

AIdan javob

using direktivasi o'z-o'zidan bajariladigan kodni ishlab chiqmaydi. U kompilator tomonidan kompilatsiya bosqichida ishlanadi va bir nechta maqsadlar uchun ishlatiladi:

  1. Foydalaniladigan nomlar bo'sh joylarini ko'rsatish (usings for namespaces): Belgilangan nomlar bo'sh joylaridagi turlarni to'liq sifatlangan nomsiz ishlatishga imkon beradi. Kompilatsiyadan so'ng, IL kodidagi turlarga bo'ladigan murojaatlar to'liq sifatlangan nomlarni (nomlar bo'sh joyi + tur nomi) o'z ichiga oladi.

    // Kompilatsiyadan oldin:
    using System;
    
    // Console sinfini sifat bilan ishlatmasdan
    Console.WriteLine("Hello"); 
    
    // Kompilatsiyadan so'ng (IL kodida):
    // System.Console::WriteLine(string) metodini chaqirish
    
  2. Nomlar bo'sh joylari yoki turlar uchun aliaslar (using aliases): Nomlar bo'sh joyi yoki tur uchun qisqa nom yaratadi. IL kodida asl to'liq nomlar ishlatiladi, aliaslar emas.

    // Kompilatsiyadan oldin:
    using MyCustomType = MyProject.MyNamespace.SomeVeryLongTypeName;
    
    MyCustomType instance = new MyCustomType();
    
    // Kompilatsiyadan so'ng (IL kodida):
    // MyProject.MyNamespace.SomeVeryLongTypeName ning nusxasini yaratish
    
  3. Statik using (using static): Turi statik a'zolarini to'g'ridan-to'g'ri chaqirish imkonini beradi. IL kodida chaqiruv to'liq nomli tur va statik metodni o'z ichiga oladi.

    // Kompilatsiyadan oldin:
    using static System.Math;
    
    double result = Sqrt(16.0); // Math.Sqrt dan foydalanish
    
    // Kompilatsiyadan so'ng (IL kodida):
    // System.Math::Sqrt(double) statik metodini chaqirish
    
  4. using direktivasi (Statement block): IDisposable interfeysini amalga oshiradigan resurslarni to'g'ri boshqarishni ta'minlaydi. Kompilator try...finally blokini yaratadi, u ob'ektning Dispose() metodini chaqiradi.

    // Kompilatsiyadan oldin:
    using (var stream = new System.IO.FileStream("file.txt", System.IO.FileMode.Open))
    {
        // oqim bilan ishlash
    } // Dispose() bu yerda chaqiriladi
    
    // Kompilatsiyadan so'ng (IL kodida misol):
    /*
    .try
    {
        // stream ob'ektini yaratish
        // oqim bilan ishlash
    }
    finally
    {
        // null tekshiruvi va stream.Dispose() chaqirish
    }
    */
    

Shunday qilib, using direktivalari kompilatsiya qilingan kodda o'zlari sifatida qolmaydi. Ular qanday qilib kompilator tur va a'zolar nomlarini hal qilishini (birinchi uchta holatlar uchun) va resurslarni boshqarish uchun kodni qanday yaratishini (oxirgi holat uchun) ta'sir qiladi.