Деревья выражений — вызов лямбды во время цикла приводит к утечке переменныхC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Деревья выражений — вызов лямбды во время цикла приводит к утечке переменных

Сообщение Anonymous »

Я не обнаружил особых проблем с деревьями выражений и хотел бы знать, является ли это ошибкой или особенностью. У меня есть этот код. Первая функция присваивает единицу переменной и возвращает ее.

Код: Выделить всё

static class Functions
{
static public Expression GetOne()
{
//Returns something like this () = {int x; return x +1;}
var variable = Expression.Variable(typeof(int));
var f = Expression.Lambda(
Expression.Block(
new[] { variable },
Expression.Assign(variable, Expression.Add(variable, Expression.Constant(1)))
));
return f;
}

static public Expression ApplyTenTimes()
{
var i = Expression.Variable(typeof(int));
var breakLabel = Expression.Label();
var f = GetOneB();
var loop = Expression.Lambda(
Expression.Block(
new[] { i },
Expression.Block(
new Expression[] {
Expression.Loop(Expression.Block(
Expression.IfThen(Expression.Equal(i, Expression.Constant(10)),          Expression.Break(breakLabel)),
Expression.PostIncrementAssign(i),
Expression.Call(typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }),   Expression.Call( Expression.Invoke(f),typeof(int).GetMethod("ToString", new Type[0]))
))),
Expression.Label(breakLabel),
Expression.Invoke(f)
})));

return loop;
}
}

Код: Выделить всё

f = Functions.GetOneB().Compile();
IEnumerable a = Enumerable.Range(0, 9).Select(_ => f()).ToList();
//Prints 1
Console.WriteLine(f());

f = Functions.ApplyTenTimesB().Compile();
//Prints 1, ..., 10, 1
Console.WriteLine(f());
Я ожидал, что f всегда печатает 1, поскольку 0 — это значение по умолчанию для int.


Подробнее здесь: https://stackoverflow.com/questions/787 ... le-leaking
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»