リリースと最適化されたビルドの下で、次のコードをコンパイルするとします
namespace ConsoleApplication4
{
public class Test1
{
private int myIntToInitalize;
public Test1()
{
myIntToInitalize = 10;
}
}
public class Test2
{
private int myIntToInitalize = 10;
}
static class Program
{
private static void Main()
{
}
}
}
クラステスト1のIL命令
.class public auto ansi beforefieldinit Test1
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: call instance void [mscorlib]System.Object::.ctor()
L_0006: ldarg.0
L_0007: ldc.i4.s 10
L_0009: stfld int32 ConsoleApplication4.Test1::myIntToInitalize
L_000e: ret
}
.field private int32 myIntToInitalize
}
クラステスト2のIL命令
.class public auto ansi beforefieldinit Test2
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: ldc.i4.s 10
L_0003: stfld int32 ConsoleApplication4.Test2::myIntToInitalize
L_0008: ldarg.0
L_0009: call instance void [mscorlib]System.Object::.ctor()
L_000e: ret
}
.field private int32 myIntToInitalize
}
両方のクラスが同じ数のIL命令を持っていることは非常に明白ですが、唯一の違いは、
変数は、クラスTest1の:: ctor()を呼び出す前に初期化されます。クラスTest2で::ctor()を呼び出した後、変数が初期化されます。
注:パフォーマンスに関しては、両方のクラスが同じように実行されます。IL命令の数とタイプが同じであるため、IL命令の実行順序が異なるだけです。