2013-04-09 25 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を避けるために導入されています

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

は、部分的に構築し、インスタンスで観察されている - new SampleClass()を実行した後ではなくXYへの割り当てが発生する前に。私。 Y = 10が例外をスローした場合は、nullのままであり、XYの未知の値を持つ新しいSampleClassではないことが保証されます。

+1

これらの名前がどのように形成されているかについては、[この回答はEric Lippert](http://stackoverflow.com/a/2509524/41071)を参照してください。 – svick

関連する問題