我在反编译后有了这段代码
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;
我不知道操作符/符号是什么意思&lt;&gt;在一些操作之前。有人知道吗?
答案 0 :(得分:13)
这是一个编译器生成的名称 - <>
字符对于IL中的标识符是合法的,但在C#中则不合法。因此,编译器知道它可以生成包含这些字符的名称,而且名称不会与您在代码中使用的名称冲突。
在这种特殊情况下,<>g__initLocal0
是一个新变量,它被引入来保存正在使用initializer syntax初始化的类的新构造实例。原始代码是:
sampleClass = new SampleClass() { X = 5, Y = 10};
这是为了避免在部分构造的实例中观察到sampleClass
- 在执行new SampleClass()
之后但在X
和Y
的分配发生之前。即如果Y = 10
引发异常,则会确保sampleClass
保持null
而不是新SampleClass
X
设置为5且{{1}的某些未知值}}