2013-04-09 16 views
11

Ho questo codice dopo decompilareCosa significa il simbolo <> in 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; 

Non so che cosa significa operatore/simbolo <> prima di alcune operazioni. Qualcuno lo sa?

risposta

13

È un nome generato dal compilatore - i caratteri <> sono legali per identificatori in IL, ma non in C#. Quindi, il compilatore sa che può generare nomi contenenti tali caratteri senza alcuna possibilità che il nome sia in conflitto con un nome che hai usato nel tuo codice.

In questo caso particolare, <>g__initLocal0 è una nuova variabile che è stata introdotta per contenere un'istanza di nuova costruzione di una classe che viene inizializzata utilizzando initializer syntax. Il codice originale era:

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

È introdotta per evitare sampleClass essere osservato con l'istanza parzialmente costruito - dopo new SampleClass() ha eseguito ma prima le assegnazioni a X e Y verificano. Cioè se Y = 10 genera un'eccezione, assicura che sampleClass resti null e non un nuovo SampleClass con X impostato su 5 e un valore sconosciuto per Y.

+1

Per informazioni su come si formano esattamente questi nomi, vedere [questa risposta di Eric Lippert] (http://stackoverflow.com/a/2509524/41071). – svick