Sobes.tech
Middle

Kuidas välja näeb using direktiiv pärast kompileerimist?

sobes.tech AI

Vastus AI-lt

Direktiiv using iseenesest ei genereeri täitvat koodi. Seda töödleb kompilaatoril kompileerimise etapis ning seda kasutatakse mitmel eesmärgil:

  1. Nimetusruumide kasutamise näitamine (usings for namespaces): Annab võimaluse kasutada tüüpe nimetatud nimetusruumidest ilma täieliku kvalifitseeritud nime kasutamata. Pärast kompileerimist sisaldavad IL-koodi viited tüüpidele täielikke kvalifitseeritud nimesid (nimetusruum + tüübi nimi).

    // Enne kompileerimist:
    using System;
    
    // Kasutada Console klassi ilma kvalifikatsioonita
    Console.WriteLine("Hello"); 
    
    // Pärast kompileerimist (IL-koodis):
    // kutsutakse välja System.Console::WriteLine(string)
    
  2. Nimetusruumide või tüüpide pseudonüümid (using aliases): Loob lühema nime nimetusruumile või tüübile. IL-koodis kasutatakse algseid täisnimesid, mitte pseudonüüme.

    // Enne kompileerimist:
    using MyCustomType = MyProject.MyNamespace.SomeVeryLongTypeName;
    
    MyCustomType instance = new MyCustomType();
    
    // Pärast kompileerimist (IL-koodis):
    // luuakse eksemplar MyProject.MyNamespace.SomeVeryLongTypeName tüübist
    
  3. Staatiline using (using static): Annab võimaluse otse kutsuda staatilisi tüüpi liikmeid ilma tüübi nime näitamata. IL-koodis sisaldab väljakutse täielikku tüübi ja staatilise meetodi nime.

    // Enne kompileerimist:
    using static System.Math;
    
    double result = Sqrt(16.0); // kasutab Math.Sqrt
    
    // Pärast kompileerimist (IL-koodis):
    // kutsutakse välja System.Math::Sqrt(double) staatiline meetod
    
  4. using direktiiv (Statement block): Tagab ressursside õige vabastamise, mis rakendavad IDisposable liidest. Kompileerija genereerib try...finally ploki, mis kutsub välja Dispose() meetodi objektil.

    // Enne kompileerimist:
    using (var stream = new System.IO.FileStream("file.txt", System.IO.FileMode.Open))
    {
        // töövoo kasutamine
    } // Dispose() kutsutakse välja siin
    
    // Pärast kompileerimist (ligikaudu IL-koodis):
    /*
    .try
    {
        // objekti stream loomine
        // töövoo kasutamine
    }
    finally
    {
        // null kontroll ja stream.Dispose() väljakutse
    }
    */
    

Seega, using direktiive ei jää kompileeritud koodi sellistena. Nad mõjutavad seda, kuidas kompilaator lahendab tüüpe ja liikmeid (esimese kolme juhtumi puhul) ning kuidas genereerib koodi ressursside haldamiseks (viimase juhtumi puhul).