请记住这一点checked
并unchecked
更改编译器发出的指令。例如,在 IL 中有两个(实际上更多)add
指令变体,其中一个变体忽略溢出,而另一个变体检查溢出。
由于它改变了发出的 IL,它必须应用。
例如这段代码:
static void Main(string[] args)
{
int i = 0;
int j = 1;
int k;
checked
{
k = i + j;
}
unchecked
{
k = i + j;
}
Console.ReadLine();
}
发出这个 IL:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 2
.locals init (
[0] int32 num,
[1] int32 num2,
[2] int32 num3)
L_0000: nop
L_0001: ldc.i4.0
L_0002: stloc.0
L_0003: ldc.i4.1
L_0004: stloc.1
L_0005: nop
L_0006: ldloc.0
L_0007: ldloc.1
L_0008: add.ovf
L_0009: stloc.2
L_000a: nop
L_000b: nop
L_000c: ldloc.0
L_000d: ldloc.1
L_000e: add
L_000f: stloc.2
L_0010: nop
L_0011: call string [mscorlib]System.Console::ReadLine()
L_0016: pop
L_0017: ret
}
您可以在哪里看到发出的两条不同的指令。