Sobes.tech
Middle

Kako izgleda direktiva using nakon kompilacije?

sobes.tech АИ

Одговор од АИ

Direktiva using sama po sebi ne generiše izvršni kod. Obradjuje se od strane kompajlera u fazi kompajliranja i koristi se za nekoliko svrha:

  1. Navođenje korišćenih prostora imena (usings for namespaces): Omogućava korišćenje tipova iz navedenih prostora imena bez punog kvalifikovanog imena. Nakon kompajliranja, reference na tipove u IL-kodu će sadržavati puna kvalifikovana imena (prostor imena + ime tipa).

    // Pre kompajliranja:
    using System;
    
    // korišćenje klase Console bez kvalifikacije
    Console.WriteLine("Hello"); 
    
    // Nakon kompajliranja (u IL-kodu):
    // poziv metode System.Console::WriteLine(string)
    
  2. Pseudonimi za prostore imena ili tipove (using aliases): Kreira kraće ime za prostor imena ili tip. U IL-kodu se koriste originalna puna imena, a ne pseudonimi.

    // Pre kompajliranja:
    using MyCustomType = MyProject.MyNamespace.SomeVeryLongTypeName;
    
    MyCustomType instance = new MyCustomType();
    
    // Nakon kompajliranja (u IL-kodu):
    // kreiranje instance od MyProject.MyNamespace.SomeVeryLongTypeName
    
  3. Statički using (using static): Omogućava direktno pozivanje statičkih članova tipa bez navođenja imena tipa. U IL-kodu će poziv sadržavati puno ime tipa i statičkog metoda.

    // Pre kompajliranja:
    using static System.Math;
    
    double result = Sqrt(16.0); // koristi Math.Sqrt
    
    // Nakon kompajliranja (u IL-kodu):
    // poziv statičkog metoda System.Math::Sqrt(double)
    
  4. Direktiva using (Statement block): Osigurava pravilno oslobađanje resursa koji implementiraju interfejs IDisposable. Kompajler generiše blok try...finally koji poziva metod Dispose() objekta.

    // Pre kompajliranja:
    using (var stream = new System.IO.FileStream("file.txt", System.IO.FileMode.Open))
    {
        // rad sa tokom
    } // Dispose() se poziva ovde
    
    // Nakon kompajliranja (primer u IL-kodu):
    /*
    .try
    {
        // kreiranje objekta stream
        // rad sa tokom
    }
    finally
    {
        // provera na null i pozivanje stream.Dispose()
    }
    */
    

Dakle, using direktive ne ostaju u kompajliranom kodu kao takve. One utiču na to kako kompajler rešava imena tipova i članova (za prva tri slučaja) i na generisanje koda za upravljanje resursima (za poslednji slučaj).