式ツリー

Last Updated 2011/09/21


System.Linq.Expressions 名前空間内に Expression<T> クラスがあります。このクラスは伝統的な IL ベースのメソッド本体ではなく、特定のラムダ式に対して「式ツリー」を必要とします。式ツリーはラムダ式のメモリ内表現で、式に依存しないデータ構造を生成します。

式ツリーとは何か

式ツリー "expression tree" とは、実行コードをデータ構造に変換したものです。特に、LINQ クエリ式のような C# コードを SQL データベースなどの別のプロセス上で操作するコードに変換したいときに有効です。

次のコードは、Func<T1, T2, TResult> デリゲートをラムダ式を使って定義します。

    Func<int,int,int> function = (a, b) => a + b;

ラムダ式の部分は以下のコードと同じ意味です。

private int function(int a, int b)
{
  return a + b;
}

どちらの形式であっても次のコードは有効です。

    int c = function(2, 3);

ラムダ式を使って定義した変数 function は実行コードを保持すると言い換えることができます。

すでに説明したように、式ツリーは実行コードではなく、データ構造のメモリ表現です。次に、実行コードを式ツリーに変換する手順を説明します。

System.Linq.Expressions 名前空間内にある Expression クラスを使います。以下のコードの expressino が式ツリーと呼ぶデータ構造です。

    Expression<Func<int, int, int>> expression = (a,b) => a + b;

ところで、Microsoft のサイトにおいて、"Expression Tree Visualizer" というアプリケーションが公開されています。Visual Basic のソースファイルも付いていますから利用しやすいと思います。ダウンロード先は Tools のページに書いておきました。

ExpressionTreeViewer

−以上−