Sobes.tech
Middle

როგორ გამოიყურება using დირექტივა კომპილაციის შემდეგ?

sobes.tech AI

პასუხი AI-სგან

დირექტივა using თავისთავად არ ქმნის შესრულებად კოდს. იგი დამუშავებულია კომპილატორის მიერ კომპილაციის ეტაპზე და გამოიყენება რამდენიმე მიზნისთვის:

  1. გამოყენებული სახელფასო სივრცეების მითითება (usings for namespaces): საშუალებას აძლევს გამოიყენოთ ტიპები მითითებულ სახელფასო სივრცეებიდან სრული კვალიფიციური სახელის გარეშე. კომპილაციის შემდეგ, IL-კოდში მითითებები ტიპებზე შეიცავს სრული კვალიფიციური სახელებს (სახელფასო სივრცე + ტიპის სახელი).

    // კომპილაციის წინ:
    using System;
    
    // Console კლასის გამოყენება კვალიფიკაციის გარეშე
    Console.WriteLine("Hello"); 
    
    // კომპილაციის შემდეგ (IL-კოდში):
    // გამოძახება System.Console::WriteLine(string) მეთოდს
    
  2. სახელფასო სივრცეების ან ტიპების ალისები (using aliases): ქმნის მოკლე სახელს სახელფასო სივრცეებისთვის ან ტიპებისთვის. IL-კოდში გამოიყენება ორიგინალური სრული სახელები, არა ალისები.

    // კომპილაციის წინ:
    using MyCustomType = MyProject.MyNamespace.SomeVeryLongTypeName;
    
    MyCustomType instance = new MyCustomType();
    
    // კომპილაციის შემდეგ (IL-კოდში):
    // შექმნა ინстанცია MyProject.MyNamespace.SomeVeryLongTypeName ტიპის
    
  3. სტატიკური using (using static): საშუალებას აძლევს პირდაპირ გამოიძახოთ სტატიკური წევრები ტიპის სახელის მითითების გარეშე. IL-კოდში გამოძახება შეიცავს სრული სახელი ტიპისა და სტატიკური მეთოდის.

    // კომპილაციის წინ:
    using static System.Math;
    
    double result = Sqrt(16.0); // გამოყენება Math.Sqrt
    
    // კომპილაციის შემდეგ (IL-კოდში):
    // გამოძახება System.Math::Sqrt(double) სტატიკური მეთოდის
    
  4. using დირექტივა (Statement block): უზრუნველყოფს რესურსების სწორად გათავისუფლებას, რომლებიც ახორციელებენ IDisposable ინტერფეისს. კომპილატორი ქმნის try...finally ბლოკს, რომელიც ახორციელებს Dispose() მეთოდს ობიექტზე.

    // კომპილაციის წინ:
    using (var stream = new System.IO.FileStream("file.txt", System.IO.FileMode.Open))
    {
        // მუშაობა ნაკადთან
    } // Dispose() აქ იძახება
    
    // კომპილაციის შემდეგ (IL-კოდში):
    /*
    .try
    {
        // შექმნა ობიექტის stream
        // მუშაობა ნაკადთან
    }
    finally
    {
        // null-ის შემოწმება და stream.Dispose() იძახება
    }
    */
    

ამიტომ, using დირექტივები არ რჩება კომპილირებულ კოდში როგორც ასეთი. ისინი გავლენას ახდენენ იმაზე, როგორ აძლევს კომპილატორი სახელებს ტიპებს და წევრებს (პირველ სამ შემთხვევაში) და როგორ ქმნის კოდს რესურსების მართვისთვის (ბოლოს).