C#中<>的意义

Fre*_*sen 31 .net c# class

我正在学习C#并抓住了一段我不理解的代码.我希望你能为我清除它.

CreateCustomerTask.<>c__DisplayClass0 cDisplayClass0 =
         new CreateCustomerTask.<>c__DisplayClass0();
Run Code Online (Sandbox Code Playgroud)

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

Dam*_*ver 37

您正在查看一些反编译代码 - 特别是由编译器生成的代码.

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

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


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

  • @James - 不确定你在这里得到什么.泛型是CLR中的一流概念.Lambdas,迭代器块等是编译器技巧,它们产生需要进入类的其他代码. (2认同)
  • @James,可以想象它可以,但事实上,泛型类型的IL表示看起来很不一样.值得注意的是,没有涉及"<>"字符. (2认同)

Eri*_*ert 32

正如其他人所指出的,你所看到的是编译器生成的名称,故意合法的C#,因此没有人会偶然(或故意!)导致名称冲突.

生成此名称的原因是因为;

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

由编译器生成,就像你写的那样:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

正如你所发现的那样,除了当然所有的名字都被故意破坏了.

闭包类被称为"DisplayClass"的原因有点不幸:这是调试器团队用来描述在调试器中显示时具有特殊行为的类的行话.显然,当您调试代码时,我们不希望将"x"显示为不可能命名的类的字段; 相反,你希望它看起来像任何其他局部变量.调试器中有特殊的装置可以处理这种显示类.它可能应该被称为"ClosureClass",以便更容易阅读反汇编.


Mat*_*ira 10

使用Eric Lippert的这个答案来解码诸如此类的名称<>c__DisplayClass0.根据答案中提供的表,您正在查看匿名方法闭包类.不要依赖于将来永远存在的这一点,它是一个随时可能发生变化的实施细节.