符号在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()之后但在XY的赋值发生之前。 即如果Y = 10抛出一个exception,它确保sampleClass保持为null而不是一个新的SampleClass其中X设置为5, Y为一些未知值。