的C#中的意义<>(The significance of <> in C#)

2019-07-17 16:54发布

我正在学习C#和抓了一段代码,我不明白。 我希望你能clearify对我来说。

CreateCustomerTask.<>c__DisplayClass0 cDisplayClass0 =
         new CreateCustomerTask.<>c__DisplayClass0();

什么是<>意味着什么? 为什么有一个. (点)在它的前面?

Answer 1:

您现在看到的一些反编译的代码 - 具体而言,这是由编译器生成的东西。

编译器使用<>这是一个实现细节),因为,虽然它是有效的CLR标识符与这样的人物开始,它不是在C#有效的-所以它保证该名称不会在C#代码的任何名称冲突。

为什么产生这个代码编译器不同-它可以是一个lambda的实施,或迭代器或异步块,可能还有一些其他的原因也。


并希望你的问题的另一部分还回答了-有一个. 在用于通常的原因它前面 - 到单独的命名空间的部分,或者更可能在这种情况下,从封闭类的名称的嵌套类的名称分开。



Answer 2:

正如其他人所指出的那样,你看到的是由编译器是故意合法的C#生成一个名字,所以没有人可以永远不小心(或故意!)引起名称冲突。

正在生成此名称的原因是因为,

class C
{
  void M()
  {
    int x = 1;
    Func<int, int> f = y=>x+y;
  }  
}

是由编译器产生的,就像你写:

class C
{
  private class DisplayClass
  {
    public int x;
    public int AnonymousMethod(int y)
    { 
      return this.x + y;
    }
  }
  void M()
  {
    C.DisplayClass d = new C.DisplayClass();
    d.x = 1;
    Func<int, int> f = d.AnonymousMethod;
  }
}

除当然所有的名字都刻意错位,因为你已经发现。

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



Answer 3:

使用此答案由埃里克利珀名称,如解码<>c__DisplayClass0 。 根据答案所提供的表格,你正在寻找一个匿名方法closure类。 不要依赖这个总是在将来是真实的,它是一个实现细节随时可能更改。



文章来源: The significance of <> in C#
标签: c# .net class