技术开发 频道

详谈C# 语言中的 static 关键字

  上述 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

 

0
相关文章