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# コンパイラはこれらすべてのインスタンスを既にキャッシュしているため、一度だけ構築されることも確認できました。ただし、コンパイラでも同じことができます。