问题 符号在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;

在某些操作之前,我不知道操作符/符号<>是什么意思。有人知道吗?


1298
2018-04-09 07:16


起源



答案:


这是一个编译器生成的名称 - <> 字符对于IL中的标识符是合法的,但在C#中则不合法。因此,编译器知道它可以生成包含这些字符的名称,而且名称不会与您在代码中使用的名称冲突。

在这种特殊情况下, <>g__initLocal0 是一个新变量,它被引入来保存正在使用的类初始化的新构造的实例 初始化语法。原始代码是:

sampleClass = new SampleClass() { X = 5, Y = 10};

它被引入以避免 sampleClass 用部分构造的实例观察 - 之后 new SampleClass() 已执行但在分配之前 X 和 Y 发生。即如果 Y = 10 抛出一个异常,它确保了 sampleClass 遗迹 null 而不是新的 SampleClass 同 X 设置为5和一些未知值 Y


13
2018-04-09 07:18



有关这些名称的确切形式的信息,请参阅 这个答案来自Eric Lippert。 - svick


答案:


这是一个编译器生成的名称 - <> 字符对于IL中的标识符是合法的,但在C#中则不合法。因此,编译器知道它可以生成包含这些字符的名称,而且名称不会与您在代码中使用的名称冲突。

在这种特殊情况下, <>g__initLocal0 是一个新变量,它被引入来保存正在使用的类初始化的新构造的实例 初始化语法。原始代码是:

sampleClass = new SampleClass() { X = 5, Y = 10};

它被引入以避免 sampleClass 用部分构造的实例观察 - 之后 new SampleClass() 已执行但在分配之前 X 和 Y 发生。即如果 Y = 10 抛出一个异常,它确保了 sampleClass 遗迹 null 而不是新的 SampleClass 同 X 设置为5和一些未知值 Y


13
2018-04-09 07:18



有关这些名称的确切形式的信息,请参阅 这个答案来自Eric Lippert。 - svick