2015-08-26 1 views
3

У меня есть Lazy<T>, инициализированный лямбдой. Как увидеть тело инициализирующей лямбды во время отладки? Я ожидаю иметь что-то вроде DebugView класса Expression, но я ничего не нашел.Как отладить Lazy <T>?

ответ

4

Потому что Lazy<T> принимает делегата, нет Expression класса. Ваша лямбда скомпилирована, как и любой другой код в вашем проекте, и нет предварительного просмотра этого кода во время отладки.

Lambda выражение может быть скомпилировано либо в IL, либо преобразовано в дерево выражений. Что происходит, зависит от контекста. Если ваш параметр объявлен как делегированный, будет генерироваться обычный IL-код. Если это Expression<TFunc>, вы получите дерево выражений, которое можно просмотреть.

Это хорошо explained on MSDN, основанный на методе Where, который имеет две версии: Enumerable.Where который принимает Func<T, bool> и Queryable.Where, который принимает Expression<Func<T, bool>>.

При использовании синтаксиса метода на основе для вызова метода Where в классе Enumerable (как это делается в LINQ к объектам и LINQ к XML) параметр является типом делегата System.Func<T, TResult>. Выражение lambda - самый удобный способ создания этого делегата. При вызов такого же метод, например, System.Linq.Queryable класса (как это делается в LINQ к SQL), то параметр типа является System.Linq.Expressions.Expression<Func> где Func любой из делегатов Func с до шестнадцати входных параметров. Опять же, выражение лямбда является очень кратким способом построения этого выражения tree. lambdas позволяют вызовам Where выглядеть одинаково, хотя в факт, что тип объекта, созданный из лямбда, отличается.

+0

У меня есть 3k Lazy объектов, инициализированных различными lambdas. Некоторые из них приводят к ошибкам. Ярбды содержат выражение LINQ, и я не могу поставить точки останова, чтобы увидеть, что происходит. Конечно, я могу переписать их в более «удобном для понимания месте», но ... Я думал, что должно быть более разумное решение. – f0rt

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