符号在MSIL中的含义是什么?
反编译后我有这个代码
SampleClass sampleClass; SampleClass g__initLocal0; int y; sampleClass = null; Label_0018: try { g__initLocal0 = new SampleClass(); g__initLocal0.X = 5; g__initLocal0.Y = 10; sampleClass = g__initLocal0; goto Label_003A; } catch (Exception) { Label_0035: goto Label_003A; } Label_003A: y = sampleClass.Y;
在某些操作之前,我不知道操作符/符号是什么意思。 有人知道吗?
它是一个编译器生成的名称 – <>
字符对于IL中的标识符是合法的,但在C#中则不合法。 因此,编译器知道它可以生成包含这些字符的名称,而且名称不会与您在代码中使用的名称冲突。
在这种特殊情况下, <>g__initLocal0
是一个新变量,它已被引入以保存正在使用初始化语法初始化的类的新构造实例。 原始代码是:
sampleClass = new SampleClass() { X = 5, Y = 10};
引入它是为了避免使用部分构造的实例观察sampleClass
– 在执行new SampleClass()
之后但在X
和Y
的赋值发生之前。 即如果Y = 10
抛出一个exception,它确保sampleClass
保持为null
而不是一个新的SampleClass
其中X
设置为5, Y
为一些未知值。