作成したコードの中間言語に変換した状態を確認

C#で作成されたコードは、IL(中間言語)に変換され、その後ネイティブコードに変換されます。

ここでは、ツールを使い変換後のコードを確認したいと思います。

次のコードを変換してみましょう

public class MyClass 
{
    public void Change() 
    {
        int a = 1;
        int b = 2;
        
        int temp = a;
        a = b;
        b = temp;
    }
}

ILに変換(右ウィンドウ上部のResultsからILを選択します)

    // Methods
    .method public hidebysig 
        instance void Change () cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 12 (0xc)
        .maxstack 1
        .locals init (
            [0] int32,
            [1] int32,
            [2] int32
        )

        IL_0000: nop
        IL_0001: ldc.i4.1
        IL_0002: stloc.0
        IL_0003: ldc.i4.2
        IL_0004: stloc.1
        IL_0005: ldloc.0
        IL_0006: stloc.2
        IL_0007: ldloc.1
        IL_0008: stloc.0
        IL_0009: ldloc.2
        IL_000a: stloc.1
        IL_000b: ret
    } // end of method MyClass::Change

ILに変換する前の分解されたC#のコードを確認します(右ウィンドウ上部のResultsからC#を選択します)

public class MyClass
{
    public void Change()
    {
        int num = 1;
        int num2 = 2;
        int num3 = num;
        num = num2;
        num2 = num3;
    }
}

では、次のコードはどうでしょうか?

public class MyClass 
{
    public void Change() 
    {
        int a = 1;
        int b = 2;
        
        (a, b) = (b, a);
    }
}

ILに変換する前の分解されたC#コードは・・・

public class MyClass
{
    public void Change()
    {
        int num = 1;
        int num2 = 2;
        int num3 = num2;
        int num4 = num;
        num = num3;
        num2 = num4;
    }
}

一つ多く変数が使われています。しかし、ILにしてみると最適化されて全く同じになっているのが確認できます。

    // Methods
    .method public hidebysig 
        instance void Change () cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 12 (0xc)
        .maxstack 2
        .locals init (
            [0] int32,
            [1] int32,
            [2] int32
        )

        IL_0000: nop
        IL_0001: ldc.i4.1
        IL_0002: stloc.0
        IL_0003: ldc.i4.2
        IL_0004: stloc.1
        IL_0005: ldloc.1
        IL_0006: ldloc.0
        IL_0007: stloc.2
        IL_0008: stloc.0
        IL_0009: ldloc.2
        IL_000a: stloc.1
        IL_000b: ret
    } // end of method MyClass::Change

C#

Posted by hidepon