符号<>在MSIL中

本文关键字:MSIL 符号 | 更新日期: 2023-09-27 18:08:16

我有反编译后的代码

    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;

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

符号<>在MSIL中

这是编译器生成的名称- <>字符在IL中是合法的标识符,但在c#中不是。因此,编译器知道它可以生成包含这些字符的名称,而不会有任何可能与您在代码中使用的名称冲突。

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

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

它的引入是为了避免sampleClass在部分构造的实例中被观察到——在new SampleClass()执行之后,但在对XY赋值之前。例如,如果Y = 10抛出异常,它确保sampleClass仍然是null,而不是一个新的SampleClass, X设置为5,Y设置为未知值。