私はいかなる種類のILマスターでもありません。私が書いたコードをコンパイラーがどのように作成するかを確認するために、時々それを使用します。私が疑問に思っていることの1つは、なぜ.maxstack
それが時々得る価値を得るのかということです。次のクラスについて考えてみます。
public class Sample
{
public void SomeMethod(){}
}
次に、私はこのようなプログラムを持っています:
private static void Main(string[] args)
{
Sample sample = new Sample();
sample.SomeMethod();
}
上記のコードは、次のIL(リリースコンパイル済み)を提供します。
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 13 (0xd)
.maxstack 1
.locals init ([0] class ConsoleApplication1.Sample sample)
IL_0000: newobj instance void ConsoleApplication1.Sample::.ctor()
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: callvirt instance void ConsoleApplication1.Sample::SomeMethod()
IL_000c: ret
} // end of method Program::Main
ここで、プログラムコードを次のように変更すると、次のようになります。
private static void Main(string[] args)
{
new Sample().SomeMethod();
}
...次のILコードになります。
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 11 (0xb)
.maxstack 8
IL_0000: newobj instance void ConsoleApplication1.Sample::.ctor()
IL_0005: call instance void ConsoleApplication1.Sample::SomeMethod()
IL_000a: ret
} // end of method Program::Main
2番目のILコードは短く、予想どおりでした。しかし、私が少し不思議に思うのは、なぜ.maxstack
私は2番目のコードサンプルでは8であるのに、最初のコードサンプルでは1であるのかということです。2番目のコードが、システムが操作のためにより大きなスタックを予約することにつながるのはなぜですか?