常见的C#代码与IL代码的比较
C#代码如下:
public static void Main(string[] args)
{
int a = 1;
Console.WriteLine(a * 3 + 2);
}
生成的IL指令如下
.method public hidebysig static void
Main(
string[] args
) cil managed
{
.entrypoint //主函数
.maxstack 2 //评估堆栈(evaluation stack)的最大深度
.locals init (
[0] int32 a
) //本地变量的定义
IL_0000: nop //啥都不做
IL_0001: ldc.i4.1 //将常量1存入评估堆栈
IL_0002: stloc.0 //从评估堆栈中取出值保存到序号为0的本地变量
IL_0003: ldloc.0 //读取序号为0的本地变量并存入评估堆栈
IL_0004: ldc.i4.3 //将常量3存入评估堆栈
IL_0005: mul //从评估堆栈中取出两个值,计算相乘的结果并存入评估堆栈
IL_0006: ldc.i4.2 //将常量2存入评估堆栈
IL_0007: add //从评估堆栈中取出两个值,计算相加的结果并存入评估堆栈
//调用Console.WriteLine方法,参数从评估堆栈中取出
IL_0008: call void [mscorlib]System.Console::WriteLine(int32)
IL_000d: nop //啥都不做
IL_000e: ret //从函数返回,当返回类型不为void时从评估堆栈取出返回值
} // end of method Program::Main