2013-04-09 5 views
11

У меня есть этот код после того, как декомпилироватьЧто означает символ <> в 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; 

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

ответ

13

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

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

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

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

+1

Для получения информации о том, как именно сформировались эти имена, см. [Этот ответ от Эрика Липперта] (http://stackoverflow.com/a/2509524/41071). – svick

Смежные вопросы