【发布时间】:2011-09-18 03:38:32
【问题描述】:
.NET 中的这个类型是什么?我正在使用反射来获取所有类的列表,并且这个列表出现了。
这是什么?它从何而来? DisplayClass1这个名字是怎么选的?我搜索了来源并没有看到任何东西。 <> 是什么意思? c__ 是什么意思?有参考吗?
【问题讨论】:
标签: c# .net reflection
.NET 中的这个类型是什么?我正在使用反射来获取所有类的列表,并且这个列表出现了。
这是什么?它从何而来? DisplayClass1这个名字是怎么选的?我搜索了来源并没有看到任何东西。 <> 是什么意思? c__ 是什么意思?有参考吗?
【问题讨论】:
标签: c# .net reflection
几乎可以肯定它是编译器由于 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 中)异步方法和委托生成额外的类。
【讨论】:
this 以外的变量的 lambda 表达式”?
乔恩当然是正确的。我提供了一个“解码器环”来弄清楚各种编译器生成的类型名称在这里的含义:
Where to learn about VS debugger 'magic names'
名称很长,我们有时会收到抱怨说我们因此增加了元数据的大小。我们可能会在未来的任何时候更改名称生成规则以解决此问题。 因此,不要编写利用此编译器实现细节知识的代码,这一点非常重要。
【讨论】: