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:
-
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) -
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 -
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 -
usingdirektyva (Statement block): Užtikrina teisingą išteklių atlaisvinimą, įgyvendinančiųIDisposablesąsają. Kompiliatorius generuojatry...finallybloką, kuris iškviečiaDispose()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).