反编译后我有这个代码
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
抛出一个异常,它确保了 sampleClass
遗迹 null
而不是新的 SampleClass
同 X
设置为5和一些未知值 Y
。
这是一个编译器生成的名称 - <>
字符对于IL中的标识符是合法的,但在C#中则不合法。因此,编译器知道它可以生成包含这些字符的名称,而且名称不会与您在代码中使用的名称冲突。
在这种特殊情况下, <>g__initLocal0
是一个新变量,它被引入来保存正在使用的类初始化的新构造的实例 初始化语法。原始代码是:
sampleClass = new SampleClass() { X = 5, Y = 10};
它被引入以避免 sampleClass
用部分构造的实例观察 - 之后 new SampleClass()
已执行但在分配之前 X
和 Y
发生。即如果 Y = 10
抛出一个异常,它确保了 sampleClass
遗迹 null
而不是新的 SampleClass
同 X
设置为5和一些未知值 Y
。