Я пытался разобрать исполняемый файл, созданный на 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<int, int, int> add = Program.add;
является всего лишь сахаром для Func<int, int, int> add = delegate(int a, int b) { return Program.add; };
.Но я действительно не знаю, правда ли это.Я также мог видеть, что компилятор C # уже кэширует все эти экземпляры, поэтому они создаются только один раз.Я мог бы сделать то же самое с моим компилятором.