дерева виразів

дерева виразів

Книга розрахована на широке коло Новомосковсктелей, хто цікавиться програмуванням на C # .Введіте сюди коротку анотацію

Книга: C # 4.0: повне керівництво

дерева виразів

Ще одним засобом, пов'язаним з LINQ, є дерево виразів, яке представляє лямбда-вираз у вигляді даних. Це означає, що саме лямбда-вираз можна виконати, але можна перетворити в виконувану форму. Дерева виразів инкапсулируются в класі System.Linq.Expressions.Expression. Вони виявляються придатними в тих випадках, коли запит виконується поза програмою, наприклад засобами SQL в базі даних. Якщо запит представлений у вигляді даних, то його можна перетворити в формат, зрозумілий для бази даних. Цей процес виконується, наприклад, засобами LINQ to SQL в інтегрованому середовищі розробки Visual Studio. Таким чином, дерева виразів сприяють підтримці в C # різних баз даних.

Для отримання виконуваної форми дерева виразів досить викликати метод Compile (). визначений у класі Expression. Цей метод повертає посилання, яка може бути присвоєна делегату для подальшого виконання. А тип делегата може бути оголошений власним або ж одним з визначених типів делегата Func в просторі імен System. Дві форми делегата Func вже згадувалися раніше при розгляді методів запиту, але існує і інші його форми.

Деревам виразів притаманне наступне суттєве обмеження: вони можуть представляти тільки поодинокі лямбда-вирази. З їх допомогою можна уявити блокові лямбда-вирази.

Нижче наведено приклад програми, що демонструє конкретне застосування дерева виразів. У цій програмі спочатку створюється дерево виразів, дані якого представляють метод, який визначає, чи є одне ціле число множником іншого. Потім це дерево виразів компілюється в виконуваний код. І нарешті, в цій програмі демонструється виконання скомпільованого коду.

Ось до якого результату приводить виконання цієї програми.

Число 5 є множником 10.
Число 7 не є множником 10.

Даний приклад програми наочно показує два основних етапи застосування дерева виразів. Спочатку в ній створюється дерево виразів за допомогою наступного оператора.

ExpressionIsFactorExp = (n, d) => (d! = 0). (N% d) == 0. false;

У цьому операторі конструюється уявлення лямбда-вирази в оперативній пам'яті. Як пояснювалося вище, це уявлення є по посиланню, що привласнюється делегату IsFactorExp. А в наступному операторі дані вирази перетворюються в виконуваний код.

Після виконання цього оператора делегат IsFactorExp може бути викликаний, щоб визначити, чи є одне ціле число множником іншого.

Зверніть також увагу на те, що позначає тип делегата. У цій формі делегата Funс вказуються два параметра типу int і повертається тип bool. У розглянутій тут програмі використана саме ця форма делегата Funс. сумісна з лямбда-виразами, оскільки для вираження потрібні два параметра. Для інших лямбда-виразів можуть підійти інші форми делегата Funс в залежності від кількості необхідних параметрів. Взагалі кажучи, конкретна форма делегата Funс повинна задовольняти вимогам лямбда-вирази.