Что является лучшим ресурсом для глубокого изучения деревьев выражений C #? - PullRequest
53 голосов
/ 26 марта 2009

Когда я впервые набрал этот вопрос, я сделал это, чтобы найти повторяющиеся вопросы, чувствуя, что кто-то уже задал этот вопрос. Мой план состоял в том, чтобы следовать этим двойным ссылкам вместо того, чтобы публиковать этот вопрос. Но, насколько я вижу, этот вопрос ранее не задавался ... он не появился в списке "Смежные вопросы".

Какие из лучших ресурсов вы нашли (статьи, книги, публикации в блогах и т. Д.) Для углубленного понимания деревьев выражений в C #? Я продолжаю удивляться их возможности, и теперь я нахожусь в точке, где я говорю: «Хорошо, достаточно сюрприз. Я хочу остановиться прямо сейчас и получить докторскую степень в этих вещах». Я ищу материалы, которые систематически, методично охватывают возможности, а затем разбираются с подробными примерами того, что вы можете с ними сделать.

Примечание: я не говорю о лямбда-выражениях. Я говорю о Expression и обо всех вещах, которые идут с ним и возникают из него.

Спасибо.

Ответы [ 3 ]

36 голосов
/ 26 марта 2009

Глава 11 (Внутренние деревья выражений) и глава 12 (Расширение Linq) программирования Microsoft Linq (ISBN 13: 978-0-7356-2400-9 или ISBN 10: 0-7356-2400-3) была неоценима для мне. Я не читал книгу Джонса, но он качественный парень и хорошо все объясняет, поэтому я предполагаю, что его освещение также будет хорошим.

Еще один замечательный ресурс - Блог Барта де Смета

Кроме того, следите за MSDN, пример кода для создания Simple Linq to Database (автор Pedram Rezaei) собирается получить около 40 страниц Doco, объясняющих это.

Действительно, очень полезный ресурс для дерева выражений. На самом деле, я бы посчитал, что должен иметь это Визуализатор дерева выражений инструмент отладки.

Вы также должны узнать как можно больше о посетителях дерева выражений, здесь есть довольно хороший базовый класс здесь .

Вот пример кода, полученного из этого класса Visitor, для выполнения некоторой отладки (я основал это на некотором примере кода в книге, которую я упомянул), вызов метода prependIndent - это просто метод расширения в строке, чтобы поставить «-» на каждом уровне отступа.

  internal class DebugDisplayTree : ExpressionVisitor
  {
    private int indentLevel = 0;

    protected override System.Linq.Expressions.Expression Visit(Expression exp)
    {
      if (exp != null)
      {
        Trace.WriteLine(string.Format("{0} : {1} ", exp.NodeType, exp.GetType().ToString()).PrependIndent(indentLevel));
      }
      indentLevel++;
      Expression result = base.Visit(exp);
      indentLevel--;
      return result;
    }
    ...
17 голосов
/ 26 марта 2009

Я не претендую на то, чтобы они были исчерпывающими, но у меня есть несколько Expression сообщений в моем блоге . Если вы находитесь в Великобритании, я также буду представлять сеанс на Expression в DDD Юго-Запад в мае (и прошлой ночью , но слишком поздно ;-p). Я мог бы опубликовать слайд-колоду и некоторые ссылки из смежных статей, если хотите ... к сожалению, pptx, предназначенный для разговора , редко делает разумное автономное чтение.

Некоторые другие чтения (не из блога):

(и множество сообщений здесь и на microsoft.public.dotnet.languages.csharp - попробуйте найти: + выражение -regex - "регулярное выражение"

5 голосов
/ 26 марта 2009

Изучите Схему. Выражения используют те же принципы, что и лямбда-исчисление, и, следовательно, помогут вам лучше понять.

Кроме того, вы можете посмотреть на DLR, который похож, но гораздо менее элегантен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...