什么叫拉姆达当“DisplayClass”的名字是什么意思?(What does “DisplayC

2019-09-02 02:08发布

根据这个答案时,代码使用本地变量从内部拉姆达方法,编译器将生成可以有名称,如额外的课程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 “手段”

Ç - >匿名方法闭合类(“DisplayClass”)

好了,但什么是“DisplayClass”这里的意思?

这是什么生成的类“摆设”? 换句话说它为什么不是“MagicClass”或“GeneratedClass”或任何其他的名字?

Answer 1:

从答案由埃里克利珀一个相关的问题 :

一个封闭类被称为“DisplayClass”的原因是有点可惜:这是使用调试器开发团队来描述在调试器中显示时有特殊的行为一类术语。 显然,我们不希望显示“×”,当您在调试代码不可能名为类的字段; 相反,你希望它看起来像任何其他本地变量。 有一个在调试器的特殊齿轮来处理这种显示类的这样做。 这或许应该被称为“ClosureClass”来代替,以使其更易于阅读拆卸。



Answer 2:

你可以从作为可从SSCLI20分布,CSHARP / sccomp子目录中的C#编译器的源的一些见解。 搜索代码为“显示”给出了fncbind.cpp源代码文件点击率最高。 你会看到它在代码符号以及注释中使用。

该意见强烈建议,这是由团队,可能是由于早在设计会议内部使用的一个术语。 这是.NET 2.0的老式代码,有没有大量的代码重写还怎么回事。 只是迭代器和匿名方法,无论是在非常相似的方式来实现。 术语“显示类”是从在评论“用户类”,明确暗示他们使用的术语来表示自动生成的类偏移量。 没有强烈的暗示为什么“显示”被青睐,我怀疑它可能有一些做这些类是在组件的元数据可见。



Answer 3:

基于反射,DisplayClass可译为CompilerGeneratedClass

[CompilerGenerated]
private sealed class <>c__DisplayClass16b
{
// Fields
public MainForm <>4__this;
public object sender;

// Methods
public void <cmdADSInit_Click>b__16a()
  {
    ADS.Initialize();
    this.<>4__this._Sender = this.sender;
    this.<>4__this.SelectedObject = ADS.Instance;
  }
}


文章来源: What does “DisplayClass” name mean when calling lambda?
标签: c# .net lambda