Код: Выделить всё
var param = Expression.Parameter(typeof(int));
var innerParam = Expression.Parameter(typeof(Action));
var inner = Expression.Lambda(innerParam.Type, Expression.Block(), "test", new[] { param });
var outer = Expression.Lambda(Expression.Block(new[] { innerParam }, Expression.Assign(innerParam, inner), Expression.Invoke(innerParam, param)), param).Compile();
Напротив, эквивалент этой функции, не основанный на выражениях
Код: Выделить всё
Action outer = x =>
{
Action innerParam = _ => { };
innerParam(x);
};
Я с трудом понимаю, почему. Это предназначено? Есть ли какой-нибудь изящный трюк для кэширования делегатов версии на основе выражений?
Для контекста: это возникло при использовании внешней библиотеки десериализации, которая, казалось, выделяла необоснованный объем памяти из-за создания делегата в нашем процессе. По сути, он делает нечто очень похожее — создает десериализаторы с помощью деревьев выражений и назначает делегатов локальным переменным для поддержки рекурсивной и циклической десериализации.
Подробнее здесь: https://stackoverflow.com/questions/787 ... s-non-expr
Мобильная версия