我尝试反汇编 C# 创建的可执行文件,但无法得出结论。我想知道的是,对于 CLR,c# 的代表是真的特殊实体还是只是编译器糖?
我问这个是因为我正在实现一种可以编译为 C# 的语言,而且将匿名函数编译为类比编译为委托对我来说更有趣。但是我不想使用以后会后悔的设计,因为它们可能会占用更多内存(我认为 Java 的 PermGen 可以作为我提问的基础。尽管我知道 CLR 没有这样的东西)。
谢谢!
- 编辑
为了更清楚一点,我想知道以下之间是否存在(以及有什么区别):
void Main()
{
Func<int, int, int> add = delegate(int a, int b) {return a + b;};
}
并且,例如
class AnonFuncion__1219023 : Fun3
{
public override int invoke(int a, int b)
{
return a + b;
}
}
- 编辑
我认为两者之间可能存在很大差异:
class Program
{
static int add(int a, int b)
{
return a + b;
}
static void Main()
{
Func<int, int, int> add = Program.add;
}
}
和
class Function__432892 : Fun3
{
public override int invoke(int a, int b)
{
return Program.add(a, b);
}
}
不过,我在某处读到该语法Func<int, int, int> add = Program.add;
只是Func<int, int, int> add = delegate(int a, int b) { return Program.add; };
. 但我真的不知道这是不是真的。我还可以看到 C# 编译器已经缓存了所有这些实例,因此它们只构造一次。不过,我可以用我的编译器做同样的事情。