符号<>在MSIL中的含义是什么?

Jac*_*cek 11 .net c# cil

反编译后我有这个代码

    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()执行之后但在赋值XY发生之前.也就是说,如果Y = 10抛出一个异常,它确保了sampleClass遗体null,而不是一个新的SampleClassX设定为5,对于一些未知值Y.

  • 有关这些名称到底是如何形成的信息,请参阅 [Eric Lippert 的回答](http://stackoverflow.com/a/2509524/41071)。 (2认同)