При построении LambdaExpression во время выполнения, если я использую LambdaExpression в качестве параметра для выражения вызова (например, при использовании Linq), затем компилируется основная лямбда, компилируется ли вложенная лямбда или она нужна?
Код работает так же, если я использую LambdaExpression в качестве параметра для метода, принимающего Func<T, T2>
, или если я скомпилирую его и использую Expression.Constant
вместо скомпилированного Func
.
Не скомпилировано:
var selectParam = Expression.Parameter(propType, "selectParam");
var selectExp = Expression.Call(typeof(System.Linq.Enumerable).GetMethods().First(a => a.Name == "Select" && /*Func<TSource,TResult>*/ a.GetParameters().Last().ParameterType.GenericTypeArguments.Length == 2).MakeGenericMethod(propType, typeof(int)),
whereExp,
Expression.Lambda(Expression.Property(selectParam, "Length"), selectParam));
Скомпилировано:
var selectParam = Expression.Parameter(propType, "selectParam");
var selectExp = Expression.Call(typeof(System.Linq.Enumerable).GetMethods().First(a => a.Name == "Select" && /*Func<TSource,TResult>*/ a.GetParameters().Last().ParameterType.GenericTypeArguments.Length == 2).MakeGenericMethod(propType, typeof(int)),
whereExp,
Expression.Constant(Expression.Lambda(Expression.Property(selectParam, "Length"), selectParam).Compile())); //compile
Выражения, которые я создаю, вызываются в цикле миллионы раз, поэтому я хотел бы знать, компилирует ли внутренняя лямбда компиляцию внешней лямбдыправильно.
Поскольку это не легко объяснить, см. мою скрипку здесь .
Я почти уверен, что они не будут бытьскомпилировано так, что вызываемые методы могут захотеть, чтобы они были выражениями для их анализа.В этом случае, есть ли прирост производительности во время выполнения, чтобы скомпилировать их, когда используется так?
Мышление на более высоком уровне, при стандартном использовании в цикле - это вообще оптимизировано?Разумеется, они не компилируются при каждом вызове при выполнении linq над массивом или чем-то подобным?