根据这个答案,当代码在lambda方法中使用局部变量时,编译器会生成额外的类,这些类可能有类似于c__DisplayClass1
的名称。例如,以下(完全无用的)代码:
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
的类,它是编译器生成的用于保存循环变量的类的名称。
根据这个答案,c__DisplayClass
表示:
c --> 匿名方法闭包类 ("DisplayClass")
好的,但这里的 "DisplayClass" 是什么意思?
这个生成的类 "display" 了什么?换句话说,为什么它不叫做 "MagicClass" 或 "GeneratedClass" 或任何其他名称?