Я попытался разобрать исполняемый файл, созданный C #, но не смог прийти к выводу. Что я хотел бы знать, так это то, что если для CLR делегатами C # будут действительно особые объекты или просто сахар компилятора?
Я спрашиваю об этом, потому что я реализую язык, который компилируется в C #, и это было бы намного интереснее чтобы я компилировал анонимные функции как классы, а не как делегаты. Но я не хочу использовать дизайн, о котором позже я пожалею, поскольку они могут быть тяжелее для памяти (я думаю о PermGen для Java, чтобы основать свой вопрос. Хотя я знаю, что для 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
- всего лишь сахар для Func
. Но я действительно не знаю, правда ли это.
Я также мог видеть, что компилятор C # уже кэширует все эти экземпляры, поэтому они создаются только один раз. Но я мог бы сделать то же самое с моим компилятором.