C#中的意义
我正在学习C#并抓住了一段我不理解的代码。 我希望你能为我清除它。
CreateCustomerTask.c__DisplayClass0 cDisplayClass0 = new CreateCustomerTask.c__DisplayClass0();
表示什么? 为什么会有
.
(点)在它面前?
您正在查看一些反编译代码 – 特别是由编译器生成的代码。
编译器使用<>
(这是一个实现细节),因为虽然CLR标识符以这些字符开头是有效的,但它在C#中无效 – 所以它保证名称不会与C#代码中的任何名称冲突。
编译器生成此代码的原因各不相同 – 它可以是lambda,迭代器或异步块的实现,也可能是其他一些原因。
并且,希望你的问题的另一部分也得到回答 – 有一个.
出于通常原因在它前面 – 分隔命名空间部分,或者更有可能在这种情况下,将嵌套类的名称与封闭类的名称分开。
正如其他人所指出的那样,您所看到的是编译器生成的名称,故意不合法C#,因此没有人会偶然(或故意!)导致名称冲突。
生成此名称的原因是因为;
class C { void M() { int x = 1; Func 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(); dx = 1; Func f = d.AnonymousMethod; } }
当然,除了你所发现的所有名字都被故意破坏了。
闭包类被称为“DisplayClass”的原因有点不幸:这是调试器团队用来描述在调试器中显示时具有特殊行为的类的行话。 显然,在调试代码时,我们不希望将“x”显示为不可能命名的类的字段; 相反,你希望它看起来像任何其他局部变量。 调试器中有一些特殊的装置可以处理这种显示类。 它可能应该被称为“ClosureClass”,以便更容易阅读反汇编。
使用Eric Lippert的这个答案来解码诸如<>c__DisplayClass0
名称。 根据答案中提供的表,您正在查看匿名方法闭包类。 不要依赖于此将来永远存在,它是一个随时可能发生变化的实施细节。