.NET中的这种类型是什么?我正在使用反射来获取所有类的列表,而这一个就出现了。
这是什么?它从何而来? DisplayClass1的名称是如何选择的?我搜索来源并没有看到任何东西。 <>
是什么意思? c__
是什么意思?有参考吗?
答案 0 :(得分:49)
由于lambda表达式或匿名方法,几乎可以肯定是编译器生成的类。例如,请考虑以下代码:
using System;
class Test
{
static void Main()
{
int x = 10;
Func<int, int> foo = y => y + x;
Console.WriteLine(foo(x));
}
}
编译成:
using System;
class Test
{
static void Main()
{
ExtraClass extra = new ExtraClass();
extra.x = 10;
Func<int, int> foo = extra.DelegateMethod;
Console.WriteLine(foo(x));
}
private class ExtraClass
{
public int x;
public int DelegateMethod(int y)
{
return y + x;
}
}
}
...除了使用<>c_displayClass1
作为名称而不是ExtraClass
。这是一个难以理解的名称,因为它无效C# - 这意味着C#编译器确信它不会出现在您自己的代码中并与其选择发生冲突。
编译匿名函数的确切方式当然是特定于实现的 - 因为可以选择额外类的名称。
编译器还为迭代器块和(在C#5中)异步方法和委托生成额外的类。
答案 1 :(得分:23)
乔恩当然是对的。我提供了一个“解码器环”,用于确定各种编译器生成类型名称的含义:
Where to learn about VS debugger 'magic names'
名称很长,我们有时会抱怨我们正在扩大元数据的大小。我们可能会在将来的任何时候更改名称生成规则以解决此问题。 因此,编写利用此编译器实现细节知识的代码非常重要。