式ツリーとは
コードがデータ構造として表現される仕組みを理解します。
「式ツリーとは」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
コードをデータとして扱う
式ツリーは、実行することしかできないコンパイル済みの命令ではなく、実行時に調査できるデータ構造としてコードを表現します。C# では Expression<TDelegate> によってこれをモデル化します。
デリゲートとツリーへのラムダ式
ラムダ式を Func<...> に代入すると、実行可能なコードが得られます。同じラムダ式を Expression<Func<...>> に代入すると、コンパイラーはその内容を説明するツリーを構築します。
using System;
using System.Linq.Expressions;
Func<int, int> runnable = x => x + 1; // compiled delegate
Expression<Func<int, int>> tree = x => x + 1; // data structure
Console.WriteLine(runnable(5)); // 6
Console.WriteLine(tree); // x => (x + 1)ツリーを調査する
式ツリーはデータであるため、そのパラメーター、本文、ノードの種類といった構成要素を読み取ることができます。
using System;
using System.Linq.Expressions;
Expression<Func<int, int>> tree = x => x + 1;
Console.WriteLine(tree.Parameters[0].Name); // x
Console.WriteLine(tree.Body.NodeType); // Add
Console.WriteLine(tree.ReturnType); // System.Int32Expression の階層
すべてのノードは System.Linq.Expressions.Expression から派生します。一般的な種類には、BinaryExpression、ParameterExpression、ConstantExpression、MethodCallExpression があります。
using System;
using System.Linq.Expressions;
Expression<Func<int, int>> tree = x => x + 1;
var body = (BinaryExpression)tree.Body;
Console.WriteLine(body.Left); // x
Console.WriteLine(body.Right); // 1式形式のラムダ式だけが使用可能
ツリーに変換できるのは、単一の式から成るラムダ式だけです。ステートメント形式のラムダ式(中かっこを使用するもの)は、式ツリーにできません。
using System;
using System.Linq.Expressions;
Expression<Func<int, int>> ok = x => x * 2; // fine
// Expression<Func<int,int>> bad = x => { return x*2; }; // compile error
Console.WriteLine(ok); // x => (x * 2)重要な理由
式ツリーを使うと、ライブラリはコードを単に実行するのではなく、コードを理解できます。LINQ プロバイダーは、式ツリーを SQL、動的クエリ、その他の対象に変換します。
NodeType が操作を示す
NodeType プロパティは、そのノードでの操作を識別する ExpressionType 列挙値です。
using System;
using System.Linq.Expressions;
Expression<Func<int, bool>> tree = x => x > 10;
Console.WriteLine(tree.Body.NodeType); // GreaterThan定数とパラメーター
ParameterExpression は入力を表し、ConstantExpression はコードに埋め込まれたリテラル値を保持します。
using System;
using System.Linq.Expressions;
Expression<Func<int, int>> tree = x => x + 5;
var body = (BinaryExpression)tree.Body;
Console.WriteLine(body.Left.GetType().Name); // ParameterExpression (or TypedParameterExpression)
Console.WriteLine(((ConstantExpression)body.Right).Value); // 5ツリー内のメソッド呼び出し
メソッドを呼び出すラムダ式は MethodCallExpression になり、メソッドとその引数を公開します。
using System;
using System.Linq.Expressions;
Expression<Func<string, int>> tree = s => s.Length;
// member access here; a call example:
Expression<Func<string, string>> call = s => s.ToUpper();
var mc = (MethodCallExpression)call.Body;
Console.WriteLine(mc.Method.Name); // ToUpperツリーは不変
式ツリーは不変です。式ツリーを「変更」するには、その構成要素から新しいツリーを構築します。ビジターやリライターはこの仕組みで動作します。
まとめ
ここでは、小さな述語ツリーをパラメーター、演算子、定数の順に最初から最後まで調べます。
using System;
using System.Linq.Expressions;
Expression<Func<int, bool>> isAdult = age => age >= 18;
var body = (BinaryExpression)isAdult.Body;
Console.WriteLine(isAdult.Parameters[0].Name); // age
Console.WriteLine(body.NodeType); // GreaterThanOrEqual
Console.WriteLine(((ConstantExpression)body.Right).Value); // 18クイックチェック
式ツリーの特徴を確認します。
まとめ
式ツリーとは何かを学びました。
Expression<TDelegate>は、調査可能なデータとしてコードを表現します。- ノードには、パラメーター、定数、二項演算、メソッド呼び出しなどがあります。
- 使用できるのは単一の式から成るラムダ式だけです。
- ツリーは不変であり、書き換えによって新しいツリーを構築します。
よくある質問
「式ツリーとは」レッスンは無料ですか?
はい。「式ツリーとは」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「式ツリーとは」で何を学びますか?
コードがデータ構造として表現される仕組みを理解します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「式ツリーとは」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。