Sobes.tech
Middle

Компиляциядан кийин using директивасы кандай көрүнөт?

sobes.tech AI

AIден жооп

Директива using өзү өзү иштеп чыгуу кодуна жараша иштебейт. Ал компилятор тарабынан компиляция учурунда иштетилет жана бир нече максаттарга колдонулат:

  1. Колдонулган кеңейтүү аянттары (usings for namespaces): Төртүнчү кеңейтүү аянттарынан типтерди колдонууга мүмкүндүк берет, толук квалификацияланган аталышсыз. Компиляциядан кийин, IL-коддогу шилтемелер толук квалификацияланган аталыштарды камтыйт (аталыш кеңейтиши + типтин аты).

    // Компиляцияга чейин:
    using System;
    
    // Console классын квалификациясыз колдонуу
    Console.WriteLine("Hello"); 
    
    // Компиляциядан кийин (IL-коддо):
    // System.Console::WriteLine() методун чакыруу
    
  2. Аталыштар үчүн псевдонимдер (using aliases): Аталыштар үчүн кыска ат түзөт. IL-коддо оригиналдуу толук аттар колдонулат, псевдонимдер эмес.

    // Компиляцияга чейин:
    using MyCustomType = MyProject.MyNamespace.SomeVeryLongTypeName;
    
    MyCustomType instance = new MyCustomType();
    
    // Компиляциядан кийин (IL-коддо):
    // MyProject.MyNamespace.SomeVeryLongTypeName типинин экземплярин түзүү
    
  3. Статикалык using (using static): Типтин статикалык мүчөлөрүн аталыш көрсөтпөстөн чакырууга мүмкүндүк берет. IL-коддо типтин толук аты жана статикалык метод көрсөтүлөт.

    // Компиляцияга чейин:
    using static System.Math;
    
    double result = Sqrt(16.0); // Math.Sqrt колдонуу
    
    // Компиляциядан кийин (IL-коддо):
    // System.Math::Sqrt(double) статикалык методун чакыруу
    
  4. using директивасы (Statement block): IDisposable интерфейсин ишке ашырган ресурстарды туура бошотууга мүмкүндүк берет. Компилятор try...finally блогун түзүп, Dispose() методун чакырат.

    // Компиляцияга чейин:
    using (var stream = new System.IO.FileStream("file.txt", System.IO.FileMode.Open))
    {
        // агым менен иштөө
    } // Dispose() бул жерде чакырылат
    
    // Компиляциядан кийин (IL-коддо):
    /*
    .try
    {
        // stream объектисин түзүү
        // агым менен иштөө
    }
    finally
    {
        // null текшерүү жана stream.Dispose() чакыруу
    }
    */
    

Демек, using директивалары компиляцияланган коддо өзүнчө калбайт. Алар типтердин жана мүчөлөрдүн аттарын чечүүдө (алдыңкы үч учур үчүн) жана ресурстарды башкаруу кодун түзүүдө (акыркы учур үчүн) таасир этет.