根據this answer,當代碼使用lambda方法內部的局部變量時,編譯器將生成可以具有名稱的額外類,如c__DisplayClass1
。例如,下面的(完全無用的)代碼:調用lambda時,「DisplayClass」名稱的含義是什麼?
class Program
{
static void Main()
{
try {
implMain();
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
}
static void implMain()
{
for (int i = 0; i < 10; i++) {
invoke(() => {
Console.WriteLine(i);
throw new InvalidOperationException();
});
}
}
static void invoke(Action what)
{
what();
}
}
輸出以下調用堆棧:
System.InvalidOperationException
at ConsoleApplication1.Program.<>c__DisplayClass2.<implMain>b__0()
at ConsoleApplication1.Program.invoke(Action what)
at ConsoleApplication1.Program.implMain()
at ConsoleApplication1.Program.Main()
。注意,在有c__DisplayClass2
其是由編譯器產生的一類名來保存循環變量。
據this answerc__DisplayClass
「是指」
Ç - >匿名方法closure類( 「DisplayClass」)
好了,但什麼是 「DisplayClass」 這裏的意思?
這是什麼產生類「顯示」?換句話說,爲什麼它不是「MagicClass」或「GeneratedClass」或任何其他名稱?
@PinnyM在那裏回答說 「C - >匿名方法closure類(」 DisplayClass 「)」,而並沒有真正的回答「它是什麼意思」。 – sharptooth 2013-05-06 15:29:12
是的,它是封裝匿名方法閉包的類。正如那篇文章所解釋的那樣,這些名字是隨意的,隨時都可以改變 - 除此之外,它沒有任何意義。如果你想了解更多細節,大聲呼叫Eric ... – PinnyM 2013-05-06 15:34:10
@PinnyM:好的,答案也是這樣的:「那是開發者可以在那個時候發明的最好的東西」? – sharptooth 2013-05-06 15:35:06