Sobes.tech
Middle

Ako vyzerá direktíva using po kompilácii?

sobes.tech AI

Odpoveď od AI

Direktíva using sama o sebe ne generuje izvršný kód. Spracováva ju kompilátor v štádiu kompilácie a slúži na niekoľko účelov:

  1. Uvedenie používaných priestorov mien (usings for namespaces): Umožňuje používať typy z uvedených priestorov mien bez úplného kvalifikovaného mena. Po kompilácii budú odkazy na typy v IL-kóde obsahovať úplné kvalifikované mená (priestor mien + názov typu).

    // Pred kompiláciou:
    using System;
    
    // použitie triedy Console bez kvalifikácie
    Console.WriteLine("Hello"); 
    
    // Po kompilácii (v IL-kóde):
    // volanie metódy System.Console::WriteLine(string)
    
  2. Pseudonymy pre priestory mien alebo typy (using aliases): Vytvára skrátené meno pre priestor mien alebo typ. V IL-kóde sa používajú pôvodné úplné mená, nie pseudonymy.

    // Pred kompiláciou:
    using MyCustomType = MyProject.MyNamespace.SomeVeryLongTypeName;
    
    MyCustomType instance = new MyCustomType();
    
    // Po kompilácii (v IL-kóde):
    // vytvorenie inštancie od MyProject.MyNamespace.SomeVeryLongTypeName
    
  3. Statické using (using static): Umožňuje priamo volať statické členy typu bez uvádzania mena typu. V IL-kóde bude volanie obsahovať úplné meno typu a statickej metódy.

    // Pred kompiláciou:
    using static System.Math;
    
    double result = Sqrt(16.0); // použitie Math.Sqrt
    
    // Po kompilácii (v IL-kóde):
    // volanie statickej metódy System.Math::Sqrt(double)
    
  4. Direktíva using (Statement block): Zabezpečuje správne uvoľnenie zdrojov, ktoré implementujú rozhranie IDisposable. Kompilátor generuje blok try...finally, ktorý volá metódu Dispose() objektu.

    // Pred kompiláciou:
    using (var stream = new System.IO.FileStream("file.txt", System.IO.FileMode.Open))
    {
        // práca s tokom
    } // Volanie Dispose() sa vykoná tu
    
    // Po kompilácii (približne v IL-kóde):
    /*
    .try
    {
        // vytvorenie objektu stream
        // práca s tokom
    }
    finally
    {
        // kontrola na null a volanie stream.Dispose()
    }
    */
    

Takže, using direktívy sa v skompilovanom kóde neuchovávajú ako také. Ovplyvňujú spôsob, akým kompilátor rieši mená typov a členov (pre prvé tri prípady) a spôsob generovania kódu na správu zdrojov (pre posledný prípad).