0Pricing
C# Academy · レッスン

式ツリーとは

コードがデータ構造として表現される仕組みを理解します。

「式ツリーとは」は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.Int32

Expression の階層

すべてのノードは 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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 式ツリーとは
  2. 式の手動構築
  3. 式のコンパイルと実行
  4. LINQプロバイダーにおける式ツリー
← C# Academyに戻る