在 C# 中,匿名方法提供了一種內聯定義委托代碼塊的便捷語法。然而,.NET CLR 並無法直接執行這類「自由流動」的代碼塊,它要求每個方法必須屬於某個類型,並且是靜態或實例方法。因此,當編譯器遇到匿名方法時,會在定義該匿名方法的類中隱式生成一個私有的靜態或實例方法,將匿名方法的代碼封裝其中,並用此方法的地址替換原本的匿名方法表達式。
關鍵在於匿名方法內部是否訪問了外部類的實例數據成員:
private static 方法,因為調用靜態方法更高效,無需 this 引用。private instance 方法,以便通過 this 訪問實例字段。當匿名方法不捕獲任何外部變量時,ILDASM 視圖顯示編譯器在 Program 類中新增了一個靜態方法(如 <Main>b__0),並將委托綁定至該方法。

若在匿名方法中引用實例字段 m_iCount,編譯器便會生成一個實例方法。以下代碼展示了這一場景:
public class Program
{
public delegate void MyDelegate();
public int m_iCount = 0;
public static void Main(string[] args)
{
Program p = new Program();
for (int i = 1; i <= 5; i++)
p.TestInstanceDataMembers();
}
public void TestInstanceDataMembers()
{
MyDelegate d = delegate
{
Console.WriteLine("Count: {0}", ++m_iCount);
};
d();
}
}
編譯後,ILDASM 顯示新增了一個私有實例方法(如 <TestInstanceDataMembers>b__0),其 IL 代碼中包含 ldarg.0(載入 this)並訪問 m_iCount。

匿名方法本質上是編譯器層面的語法糖。理解其背後的靜態/實例方法生成規則,有助於開發者更準確地預測閉包行為、避免意外的捕獲語義,並在性能敏感場景下做出更優的設計選擇。