2015-04-24 6 views
0

От the documentation, и из его имени подразумевается, что значение свойства CanReduce должно быть установлено равным true для всех выражений, которые можно разложить на более мелкие выражения, и наоборот.Что означает свойство System.Linq.Expressions.Expression.CanReduce?

Но при более близком наблюдении этот вывод кажется недействительным во всех случаях. Возьмите случай LambdaExpression, который, безусловно, представляет собой составной блок. Но класс LambdaExpression, полученный непосредственно из класса Expression, не переопределяет свойство CanReduce. Класс Expression определяет свойство CanReduce как виртуальное с реализацией, которая возвращает false, что подразумевает, что выражение лямбда еще не приводится к сокращению, что неверно.

В чем же смысл этого свойства?

+2

Например, составное назначение 'a + = b' можно свести к' a = a + b'. – PetSerAl

+0

Ницца. Спасибо. Является ли смысл ограниченным только этими операторами (я забыл, что они называются)? –

+0

Я не углубляюсь в 'System.Linq.Expressions', чтобы сказать, что это правда или нет. – PetSerAl

ответ

1

Я думаю, что вы неправильно читаете документацию. «Сокращение» здесь не означает разложения на несколько более простых выражений, это означает преобразование в одно выражение, которое использует более основные операции. Например, рассмотрим следующий ListInitExpression (с помощью C# -like синтаксис):

new List<int> { 1, new Random().Next() } 

Calling CanReduce на это выражение будет возвращать true. И, подозвав Reduce() вернешься:

{ 
    Param_0 = new List<int>(); 
    Param_0.Add(1); 
    Param_0.Add(new Random().Next()); 
    return Param_0; 
} 

Это не для меня ясно, что должно Reduce() на LambdaExpression возвращении, так что имеет смысл для меня, что это не приводит.

1

я разместил больше отвечать здесь более подробно: What does Expression.Reduce() do?, но короткая форма является то, что вне коробки поведения .NET, кажется, только уменьшить следующие сценарии:

  • назначения соединения, например, x += 4
  • Приращение/декремент до/после подачи, например. x++, --y
  • Инициализация членов и списков, например. new List<int>() { 4, 5 }, new Thing() { Prop1 = 4, Prop2 = 5 }

Все остальное остается как есть. Я не видел каких-либо доказательств для отбраковки мертвых выражений или против них, как часть операции уменьшения (например, пустое BlockExpression не будет удалено из дерева выражений во время вызовов Reduce()).

+0

Красивая, практичная и полезная, как вы ее на это отвечаете. Спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^