我正在学习C#并抓住了一段我不理解的代码。我希望你能为我清除它。
CreateCustomerTask.<>c__DisplayClass0 cDisplayClass0 =
new CreateCustomerTask.<>c__DisplayClass0();
<>
表示什么?为什么前面有.
(点)?
答案 0 :(得分:33)
您正在查看一些反编译代码 - 特别是编译器生成的代码。
编译器使用<>
(这是一个实现细节),因为虽然CLR标识符以这些字符开头是有效的,但它在C#中无效 - 所以它保证名称不会与任何字符冲突C#代码中的名称。
为什么编译器生成的代码各不相同 - 它可以是lambda的实现,也可以是迭代器或异步块,也可能是其他一些原因。
并且,希望你的问题的另一部分也得到回答 - 由于通常的原因,在它前面有一个.
- 分隔名称空间部分,或者更有可能在这种情况下,分隔名称来自封闭类名称的嵌套类。
答案 1 :(得分:30)
正如其他人所指出的那样,你所看到的是编译器生成的一个名称,它故意不是合法的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”,以便更容易阅读反汇编。
答案 2 :(得分:10)
使用Eric Lippert的this answer解码<>c__DisplayClass0
等名称。根据答案中提供的表,您正在查看匿名方法闭包类。不要依赖于将来永远存在的,这是一个随时可能发生变化的实施细节。