Ich habe versucht, ein mit C# erstellbares ausführbares Programm zu zerlegen, kam aber zu keinem Ergebnis. Was ich gerne wissen würde, ist, ob für das CLR c#'s Delegaten wirklich spezielle Entitäten oder nur Zucker für den Compiler sind?
Ich frage deshalb, weil ich eine Sprache implementiere, die nach C# compiliert wird, und es für mich viel interessanter wäre, anonyme Funktionen als Klassen zu kompilieren, anstatt als Delegaten. Aber ich möchte kein Design verwenden, das ich später bereuen werde, da sie möglicherweise mehr Speicher verbrauchen (ich denke an Javas PermGen, um meine Fragestellung zu begründen. Obwohl ich weiß, dass es so etwas nicht für das CLR gibt).
Danke!
-- Bearbeiten
Um ein wenig klarer zu sein, würde ich gerne wissen, ob es Unterschiede gibt (und welche) zwischen:
void Main()
{
Func add = delegate(int a, int b) {return a + b;};
}
und zum Beispiel
class AnonFuncion__1219023 : Fun3
{
public override int invoke(int a, int b)
{
return a + b;
}
}
-- Bearbeiten
Ich denke, dass es einen großen Unterschied machen könnte zwischen:
class Program
{
static int add(int a, int b)
{
return a + b;
}
static void Main()
{
Func add = Program.add;
}
}
und
class Function__432892 : Fun3
{
public override int invoke(int a, int b)
{
return Program.add(a, b);
}
}
Ich habe irgendwo gelesen, dass die Syntax Func add = Program.add;
nur eine Abkürzung für Func add = delegate(int a, int b) { return Program.add; };
ist. Aber ich weiß nicht wirklich, ob das stimmt. Ich konnte auch sehen, dass der C#-Compiler bereits alle diese Instanzen cacht, so dass sie nur einmal erstellt werden. Das könnte ich auch mit meinem Compiler machen.