Подтвердить что ты не робот

Что означает символ <> в 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;

Я не знаю, что означает оператор/символ < > перед некоторыми операциями. Кто-нибудь знает?

4b9b3361

Ответ 1

Это сгенерированное компилятором имя - символы <> являются законными для идентификаторов в IL, но не в С#. Таким образом, компилятор знает, что он может генерировать имена, содержащие такие символы, без каких-либо шансов, что имя будет конфликтовать с именем, которое вы использовали в вашем коде.

В этом конкретном случае <>g__initLocal0 представляет собой новую переменную, которая была введена для хранения вновь созданного экземпляра класса, который инициализируется с помощью синтаксиса инициализатора. Исходный код:

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

Введено, чтобы избежать наблюдения sampleClass с частично сконструированным экземпляром - после выполнения new SampleClass(), но до того, как произойдут назначения X и Y. То есть if Y = 10 создает исключение, он гарантирует, что sampleClass остается null, а не новый sampleClass с X, установленный в 5, и некоторое неизвестное значение для Y.