The significance of <> in C#

本文关键字:gt in lt significance of The | 更新日期: 2023-09-27 17:49:53

我正在学习c#,发现了一段我不理解的代码。我希望你能帮我澄清一下。

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

<>表示什么?为什么前面有一个.(点)?

The significance of <> in C#

您正在查看一些反编译代码—具体来说,是由编译器生成的代码。

编译器使用<>(这是一个实现细节),因为,虽然CLR标识符以这样的字符开头是有效的,但它在c#中是无效的-因此可以保证该名称不会与c#代码中的任何名称冲突。

编译器生成这段代码的原因各不相同——它可能是lambda、迭代器或异步块的实现,也可能是其他一些原因。


并且,希望您的问题的另一部分也得到了回答-由于通常的原因,在它前面有一个. -分开名称空间部分,或者更有可能在这种情况下,将嵌套类的名称与封闭类的名称分开。

正如其他人指出的那样,您所看到的是编译器生成的一个名称,它故意不是合法的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"的原因有点不幸:这是调试器团队使用的术语,用来描述在调试器中显示时具有特殊行为的类。显然,我们不希望在调试代码时将"x"显示为一个不可能命名的类的字段;相反,您希望它看起来像任何其他局部变量。在调试器中有一个特殊的齿轮来处理这种显示类。它可能应该被称为"ClosureClass",以便更容易阅读反汇编。

使用Eric Lippert的答案来解码名称,例如<>c__DisplayClass0。根据答案中提供的表,您正在查看一个匿名方法闭包类。不要指望这在将来总是正确的,这是一个实现细节,随时都可能发生变化。