Dam*_*ver 37
您正在查看一些反编译代码 - 特别是由编译器生成的代码.
编译器使用<>(这是一个实现细节),因为虽然CLR标识符以这些字符开头是有效的,但它在C#中无效 - 所以它保证名称不会与C#代码中的任何名称冲突.
为什么产生这个代码编译器不同-它可以是一个lambda的实施,或迭代器或异步块,可能还有一些其他的原因也.
并且,希望您的问题的另一部分也得到回答 - 由于.通常的原因,它前面有一个- 分隔命名空间部分,或者更有可能在这种情况下,将嵌套类的名称与封闭的名称分开类.
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",以便更容易阅读反汇编.
| 归档时间: |
|
| 查看次数: |
7398 次 |
| 最近记录: |