Sobes.tech
Middle

Kā izskatās using direktīva pēc kompilācijas?

sobes.tech AI

Atbilde no AI

Direktīva using pati par sevi ne ģenerē izpildāmo kodu. Tā tiek apstrādāta no kompilatora puses kompilācijas laikā un tiek izmantota vairākām mērķiem:

  1. Norādīt izmantotās vārdu telpas (usings for namespaces): Atļauj izmantot tipus no norādītajām vārdu telpām bez pilna kvalificēta nosaukuma. Pēc kompilācijas, saites uz tipiem IL kodā saturēs pilnus kvalificētus nosaukumus (vārdu telpa + tips).

    // Pirms kompilācijas:
    using System;
    
    // Izmantot Console klasi bez kvalifikācijas
    Console.WriteLine("Hello"); 
    
    // Pēc kompilācijas (IL kodā):
    // izsaukums uz metodi System.Console::WriteLine(string)
    
  2. Vārdu telpu vai tipu pseidonīmi (using aliases): Izveido īsāku nosaukumu vārdu telpai vai tipam. IL kodā tiek izmantoti oriģinālie pilnie nosaukumi, ne pseidonīmi.

    // Pirms kompilācijas:
    using MyCustomType = MyProject.MyNamespace.SomeVeryLongTypeName;
    
    MyCustomType instance = new MyCustomType();
    
    // Pēc kompilācijas (IL kodā):
    // izveido MyProject.MyNamespace.SomeVeryLongTypeName tipa instanci
    
  3. Statiskā using (using static): Ļauj tieši izsaukt statiskos tipu locekļus bez tipa nosaukuma norādīšanas. IL kodā izsaukums saturēs pilnu tipa un statiskās metodes nosaukumu.

    // Pirms kompilācijas:
    using static System.Math;
    
    double result = Sqrt(16.0); // izmanto Math.Sqrt
    
    // Pēc kompilācijas (IL kodā):
    // izsaukums uz System.Math::Sqrt(double) statisko metodi
    
  4. using direktīva (Statement block): Nodrošina pareizu resursu atbrīvošanu, kas realizē IDisposable interfeisu. Kompilators ģenerē try...finally bloku, kas izsauc Dispose() metodi objektam.

    // Pirms kompilācijas:
    using (var stream = new System.IO.FileStream("file.txt", System.IO.FileMode.Open))
    {
        // darbs ar straumi
    } // Dispose() tiek izsaukts šeit
    
    // Pēc kompilācijas (apmēram IL kodā):
    /*
    .try
    {
        // izveido straumes objektu
        // darbs ar straumi
    }
    finally
    {
        // null pārbaude un stream.Dispose() izsaukums
    }
    */
    

Tādējādi, using direktīvas netiek saglabātas kā atsevišķas sastāvdaļas kompilētajā kodā. Tās ietekmē to, kā kompilators risina tipus un narius (pirmie trīs gadījumi) un kā ģenerē kodu resursu pārvaldībai (pēdējais gadījums).