2010-07-01 82 views
4

這個簡單的類奇怪的反編譯的代碼認購代碼泛型類

public class Test<T> 
{ 
    public static void A(Window wa, Window wb) 
    { 
     wa.Closed += (s, e) => wb.Close(); 
    } 
} 

被編譯到這個(我使用反射來編譯):

public class Test<T> 
{ 
    [CompilerGenerated] 
    private sealed class <>c__DisplayClass1 
    { 
     public Window wb; 

     public void <A>b__0(object s, EventArgs e) 
     { 
      this.wb.Close(); 
     } 
    } 

    public static void A(Window wa, Window wb) 
    { 
     wa.Closed += delegate(object s, EventArgs e) 
     { 
      base.wb.Close(); 
     }; 
    } 
} 

是什麼意思base?如果從未使用過,爲什麼會生成<>c__DisplayClass1? 這是一個Reflector bug嗎?

編輯: 的確,好像在這種情況下,反射器優化不沃金非常好,禁用優化的反編譯的代碼是有道理的:

public class Test<T> 
{ 
    public Test() 
    { 
     base..ctor(); 
     return; 
    } 

    public static void A(Window wa, Window wb) 
    { 
     <>c__DisplayClass1<T> CS$<>8__locals2; 
     CS$<>8__locals2 = new <>c__DisplayClass1<T>(); 
     CS$<>8__locals2.wb = wb; 
     wa.Closed += new EventHandler(CS$<>8__locals2.<A>b__0); 
     return; 
    } 

    [CompilerGenerated] 
    private sealed class <>c__DisplayClass1 
    { 
     // Fields 
     public Window wb; 

     public <>c__DisplayClass1() 
     { 
      base..ctor(); 
      return; 
     } 

     public void <A>b__0(object s, EventArgs e) 
     { 
      this.wb.Close(); 
      return; 
     } 
    } 
} 
+0

這是一個很好的問題。我明白爲什麼你需要幫助類來捕獲'wb'上的閉包,但我不明白'A'中實際生成的代碼,它似乎沒有使用助手。 – 2010-07-01 15:05:22

回答

1

反射器「優化」輸出去嘗試想出C#可能的樣子。我不知道「基地」位是從哪裏來的,但是,生成的類別的確是肯定被使用。

將反射器選項設置爲「未優化」,您將看到更像IL到C#的直接轉換。或者只需切換到IL並直接閱讀,如果你想要一個非常原始的視圖。

+0

謝謝@Jon Skeet! – 2010-07-01 15:15:05