11

反编译后有这段代码

    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;

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

4

1 回答 1

13

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

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

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

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

于 2013-04-09T07:18:24.907 回答