上述 IL 代码的第 42 行到第 49 行对 mask 数组进行初始化,紧接着在第 50 行用“stloc.0”指令保存起来,然后在第 73 行用“ldloc.0”指令引用。
再看看静态的情况下该实例构造函数(.ctor)的 IL 代码:
01: .method public hidebysig specialname rtspecialname
02: instance void .ctor(uint8[] bits) cil managed
03: {
04: // 代码大小 167 (0xa7)
05: .maxstack 5
06: .locals init (bool V_0)
07: IL_0000: nop
08: IL_0001: ldarg.1
09: IL_0002: ldnull
10: IL_0003: ceq
11: IL_0005: ldc.i4.0
12: IL_0006: ceq
13: IL_0008: stloc.0
14: IL_0009: ldloc.0
15: IL_000a: brtrue.s IL_0017
16: IL_000c: ldstr "bits"
17: IL_0011: newobj instance void [mscorlib]System.ArgumentNullException::.ctor(string)
18: IL_0016: throw
19: IL_0017: ldarg.1
20: IL_0018: ldlen
21: IL_0019: conv.i4
22: IL_001a: ldc.i4.1
23: IL_001b: blt.s IL_0029
24: IL_001d: ldarg.1
25: IL_001e: ldlen
26: IL_001f: conv.i4
27: IL_0020: ldc.i4.s 9
28: IL_0022: cgt
29: IL_0024: ldc.i4.0
30: IL_0025: ceq
31: IL_0027: br.s IL_002a
32: IL_0029: ldc.i4.0
33: IL_002a: stloc.0
34: IL_002b: ldloc.0
35: IL_002c: brtrue.s IL_003e
36: IL_002e: ldstr "Invalid length"
37: IL_0033: ldstr "bits"
38: IL_0038: newobj instance void [mscorlib]System.ArgumentException::.ctor(string,
39: string)
40: IL_003d: throw
41: IL_003e: ldarg.1
42: IL_003f: ldlen
43: IL_0040: conv.i4
44: IL_0041: ldc.i4.1
45: IL_0042: ble.s IL_0050
46: IL_0044: ldarg.1
47: IL_0045: ldlen
48: IL_0046: conv.i4
49: IL_0047: ldc.i4.s 9
50: IL_0049: clt
51: IL_004b: ldc.i4.0
52: IL_004c: ceq
53: IL_004e: br.s IL_0051
54: IL_0050: ldc.i4.1
55: IL_0051: stloc.0
56: IL_0052: ldloc.0
57: IL_0053: brtrue.s IL_0074
58: IL_0055: ldarg.1
59: IL_0056: ldc.i4.0
60: IL_0057: ldelema [mscorlib]System.Byte
61: IL_005c: dup
62: IL_005d: ldobj [mscorlib]System.Byte
63: IL_0062: ldsfld uint8[] Skyiv.Numerics.ZipInteger::mask
64: IL_0067: ldarg.1
65: IL_0068: ldlen
66: IL_0069: conv.i4
67: IL_006a: ldc.i4.1
68: IL_006b: sub
69: IL_006c: ldelem.u1
70: IL_006d: and
71: IL_006e: conv.u1
72: IL_006f: stobj [mscorlib]System.Byte
73: IL_0074: ldarg.1
74: IL_0075: call void [mscorlib]System.Array::Reverse(class [mscorlib]System.Array)
75: IL_007a: nop
76: IL_007b: ldarga.s bits
77: IL_007d: ldc.i4.8
78: IL_007e: call void [mscorlib]System.Array::Resize<uint8>(!!0[]&,
79: int32)
80: IL_0083: nop
81: IL_0084: ldsfld bool [mscorlib]System.BitConverter::IsLittleEndian
82: IL_0089: stloc.0
83: IL_008a: ldloc.0
84: IL_008b: brtrue.s IL_0094
85: IL_008d: ldarg.1
86: IL_008e: call void [mscorlib]System.Array::Reverse(class [mscorlib]System.Array)
87: IL_0093: nop
88: IL_0094: ldarg.0
89: IL_0095: ldarg.1
90: IL_0096: ldc.i4.0
91: IL_0097: call int64 [mscorlib]System.BitConverter::ToInt64(uint8[],
92: int32)
93: IL_009c: call int64 Skyiv.Numerics.ZipInteger::Decode(int64)
94: IL_00a1: stfld int64 Skyiv.Numerics.ZipInteger::data
95: IL_00a6: ret
96: } // end of method ZipInteger::.ctor
02: instance void .ctor(uint8[] bits) cil managed
03: {
04: // 代码大小 167 (0xa7)
05: .maxstack 5
06: .locals init (bool V_0)
07: IL_0000: nop
08: IL_0001: ldarg.1
09: IL_0002: ldnull
10: IL_0003: ceq
11: IL_0005: ldc.i4.0
12: IL_0006: ceq
13: IL_0008: stloc.0
14: IL_0009: ldloc.0
15: IL_000a: brtrue.s IL_0017
16: IL_000c: ldstr "bits"
17: IL_0011: newobj instance void [mscorlib]System.ArgumentNullException::.ctor(string)
18: IL_0016: throw
19: IL_0017: ldarg.1
20: IL_0018: ldlen
21: IL_0019: conv.i4
22: IL_001a: ldc.i4.1
23: IL_001b: blt.s IL_0029
24: IL_001d: ldarg.1
25: IL_001e: ldlen
26: IL_001f: conv.i4
27: IL_0020: ldc.i4.s 9
28: IL_0022: cgt
29: IL_0024: ldc.i4.0
30: IL_0025: ceq
31: IL_0027: br.s IL_002a
32: IL_0029: ldc.i4.0
33: IL_002a: stloc.0
34: IL_002b: ldloc.0
35: IL_002c: brtrue.s IL_003e
36: IL_002e: ldstr "Invalid length"
37: IL_0033: ldstr "bits"
38: IL_0038: newobj instance void [mscorlib]System.ArgumentException::.ctor(string,
39: string)
40: IL_003d: throw
41: IL_003e: ldarg.1
42: IL_003f: ldlen
43: IL_0040: conv.i4
44: IL_0041: ldc.i4.1
45: IL_0042: ble.s IL_0050
46: IL_0044: ldarg.1
47: IL_0045: ldlen
48: IL_0046: conv.i4
49: IL_0047: ldc.i4.s 9
50: IL_0049: clt
51: IL_004b: ldc.i4.0
52: IL_004c: ceq
53: IL_004e: br.s IL_0051
54: IL_0050: ldc.i4.1
55: IL_0051: stloc.0
56: IL_0052: ldloc.0
57: IL_0053: brtrue.s IL_0074
58: IL_0055: ldarg.1
59: IL_0056: ldc.i4.0
60: IL_0057: ldelema [mscorlib]System.Byte
61: IL_005c: dup
62: IL_005d: ldobj [mscorlib]System.Byte
63: IL_0062: ldsfld uint8[] Skyiv.Numerics.ZipInteger::mask
64: IL_0067: ldarg.1
65: IL_0068: ldlen
66: IL_0069: conv.i4
67: IL_006a: ldc.i4.1
68: IL_006b: sub
69: IL_006c: ldelem.u1
70: IL_006d: and
71: IL_006e: conv.u1
72: IL_006f: stobj [mscorlib]System.Byte
73: IL_0074: ldarg.1
74: IL_0075: call void [mscorlib]System.Array::Reverse(class [mscorlib]System.Array)
75: IL_007a: nop
76: IL_007b: ldarga.s bits
77: IL_007d: ldc.i4.8
78: IL_007e: call void [mscorlib]System.Array::Resize<uint8>(!!0[]&,
79: int32)
80: IL_0083: nop
81: IL_0084: ldsfld bool [mscorlib]System.BitConverter::IsLittleEndian
82: IL_0089: stloc.0
83: IL_008a: ldloc.0
84: IL_008b: brtrue.s IL_0094
85: IL_008d: ldarg.1
86: IL_008e: call void [mscorlib]System.Array::Reverse(class [mscorlib]System.Array)
87: IL_0093: nop
88: IL_0094: ldarg.0
89: IL_0095: ldarg.1
90: IL_0096: ldc.i4.0
91: IL_0097: call int64 [mscorlib]System.BitConverter::ToInt64(uint8[],
92: int32)
93: IL_009c: call int64 Skyiv.Numerics.ZipInteger::Decode(int64)
94: IL_00a1: stfld int64 Skyiv.Numerics.ZipInteger::data
95: IL_00a6: ret
96: } // end of method ZipInteger::.ctor