反编译后我有这个代码
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;
Run Code Online (Sandbox Code Playgroud)
在某些操作之前,我不知道操作符/符号<>是什么意思.有人知道吗?
Dam*_*ver 13
它是一个编译器生成的名称 - 这些<>字符对于IL中的标识符是合法的,但在C#中则不合法.因此,编译器知道它可以生成包含这些字符的名称,而名称不会与您在代码中使用的名称冲突.
在这种特殊情况下,<>g__initLocal0是一个新变量,它被引入来保存使用初始化语法初始化的新构造的类实例.原始代码是:
sampleClass = new SampleClass() { X = 5, Y = 10};
Run Code Online (Sandbox Code Playgroud)
它的引入是为了避免sampleClass被部分构造的实例观察到 - 在new SampleClass()执行之后但在赋值X和Y发生之前.也就是说,如果Y = 10抛出一个异常,它确保了sampleClass遗体null,而不是一个新的SampleClass与X设定为5,对于一些未知值Y.