Sobes.tech
Middle

Kaip atrodo using direktyva po kompiliacijos?

sobes.tech AI

Atsakymas iš AI

Direktyva using pati savarankiskai ne generuoja vykdomojo kodo. Ji apdorojama kompiliatoriaus kompiiliacijos metu ir naudojama keliems tikslams:

  1. Naudojamų vardų erdvių nurodymas (usings for namespaces): Leidžia naudoti tipus iš nurodytų vardų erdvių be pilno kvalifikuoto vardo. Po kompiliacijos nuorodos į tipus IL kode bus su pilnais kvalifikuotais vardais (vardų erdvė + tipo pavadinimas).

    // Prieš kompiliaciją:
    using System;
    
    // Naudoti Console klasę be kvalifikacijos
    Console.WriteLine("Hello"); 
    
    // Po kompiliacijos (IL kode):
    // iškvietimas metodo System.Console::WriteLine(string)
    
  2. Vardų erdvių arba tipų pseudonimai (using aliases): Sukuria trumpesnį vardą vardų erdvei ar tipui. IL kode naudojami originalūs pilni vardai, o ne pseudonimai.

    // Prieš kompiliaciją:
    using MyCustomType = MyProject.MyNamespace.SomeVeryLongTypeName;
    
    MyCustomType instance = new MyCustomType();
    
    // Po kompiliacijos (IL kode):
    // sukuriamas MyProject.MyNamespace.SomeVeryLongTypeName tipo egzempliorius
    
  3. Statinis using (using static): Leidžia tiesiogiai iškviesti statinius tipo narius be tipo vardo nurodymo. IL kode iškvietimas turės pilną tipo ir statinio metodo pavadinimą.

    // Prieš kompiliaciją:
    using static System.Math;
    
    double result = Sqrt(16.0); // naudoti Math.Sqrt
    
    // Po kompiliacijos (IL kode):
    // iškvietimas sistemos.Math::Sqrt(double) statinio metodo
    
  4. using direktyva (Statement block): Užtikrina teisingą išteklių atlaisvinimą, įgyvendinančių IDisposable sąsają. Kompiliatorius generuoja try...finally bloką, kuris iškviečia Dispose() metodą objektui.

    // Prieš kompiliaciją:
    using (var stream = new System.IO.FileStream("file.txt", System.IO.FileMode.Open))
    {
        // darbo su srautu veikla
    } // čia iškviečiama Dispose()
    
    // Po kompiliacijos (apytiksliai IL kode):
    /*
    .try
    {
        // sukuriamas stream objektas
        // darbo su srautu veikla
    }
    finally
    {
        // patikrinimas ar null ir stream.Dispose() iškvietimas
    }
    */
    

Todėl, using direktyvos nėra išsaugomos kaip atskiras elementas kompiliuotame kode. Jos veikia kaip įrankis, kaip kompiliatorius sprendžia tipus ir narius (pirmieji trys atvejai) ir kaip generuoja kodą išteklių valdymui (paskutinis atvejis).