Sobes.tech
Middle

Jak vypadá direktiva using po kompilaci?

sobes.tech AI

Odpověď od AI

Direktiva using sama o sobě nevytváří spustitelný kód. Je zpracovávána kompilátorem v fázi kompilace a slouží k několika účelům:

  1. Určení používaných jmenných prostorů (usings for namespaces): Umožňuje používat typy z uvedených jmenných prostorů bez úplného kvalifikovaného názvu. Po kompilaci budou odkazy na typy v IL kódu obsahovat úplné kvalifikované názvy (jmenný prostor + název typu).

    // Před kompilací:
    using System;
    
    // použití třídy Console bez kvalifikace
    Console.WriteLine("Hello"); 
    
    // Po kompilaci (v IL kódu):
    // volání metody System.Console::WriteLine(string)
    
  2. Alias pro jmenné prostory nebo typy (using aliases): Vytváří kratší název pro jmenný prostor nebo typ. V IL kódu jsou používány původní úplné názvy, nikoli aliasy.

    // Před kompilací:
    using MyCustomType = MyProject.MyNamespace.SomeVeryLongTypeName;
    
    MyCustomType instance = new MyCustomType();
    
    // Po kompilaci (v IL kódu):
    // vytvoření instance typu MyProject.MyNamespace.SomeVeryLongTypeName
    
  3. Statické using (using static): Umožňuje přímo volat statické členy typu bez uvedení názvu typu. V IL kódu bude volání obsahovat úplný název typu a statickou metodu.

    // Před kompilací:
    using static System.Math;
    
    double result = Sqrt(16.0); // použití Math.Sqrt
    
    // Po kompilaci (v IL kódu):
    // volání statické metody System.Math::Sqrt(double)
    
  4. using-direktiva (Statement block): Zajišťuje správné uvolnění zdrojů implementujících rozhraní IDisposable. Kompilátor generuje blok try...finally, který volá metodu Dispose() objektu.

    // Před kompilací:
    using (var stream = new System.IO.FileStream("file.txt", System.IO.FileMode.Open))
    {
        // práce s proudem
    } // Dispose() je voláno zde
    
    // Po kompilaci (příklad v IL kódu):
    /*
    .try
    {
        // vytvoření objektu stream
        // práce s proudem
    }
    finally
    {
        // kontrola na null a volání stream.Dispose()
    }
    */
    

Takže, using-direktivy nezůstávají v zkompilovaném kódu jako takové. Ovlivňují, jak kompilátor řeší názvy typů a členů (pro první tři případy) a jak generuje kód pro správu zdrojů (pro poslední případ).