式の手動構築
Expression APIで式ツリーを構築します。
「式の手動構築」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
ツリーを手動で構築する
コンパイラーにラムダ式からツリーを構築させるだけでなく、Expression の静的ファクトリメソッドを使って自分で構築することもできます。
using System;
using System.Linq.Expressions;
var five = Expression.Constant(5);
Console.WriteLine(five); // 5
Console.WriteLine(five.Type); // System.Int32Expression.Parameter
Expression.Parameter(type, name) は、本文で参照したりラムダ式にバインドしたりできるパラメーターノードを作成します。
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
Console.WriteLine(x.Name + " : " + x.Type); // x : System.Int32Expression.Constant
Expression.Constant(value) はリテラルを埋め込みます。必要に応じて型も指定できます。
using System;
using System.Linq.Expressions;
var c = Expression.Constant(42);
var typed = Expression.Constant(3.14, typeof(double));
Console.WriteLine(c + " " + typed); // 42 3.14Expression.Add
二項演算子には Expression.Add のようなファクトリがあります。2 つのオペランド式を受け取り、BinaryExpression を構築します。
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var sum = Expression.Add(x, Expression.Constant(1));
Console.WriteLine(sum); // (x + 1)その他の二項演算子
演算子一式に対応するファクトリがあります。Subtract、Multiply、Divide、GreaterThan、Equal などです。
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var gt = Expression.GreaterThan(x, Expression.Constant(10));
var mul = Expression.Multiply(x, Expression.Constant(2));
Console.WriteLine(gt + " | " + mul); // (x > 10) | (x * 2)ラムダ式でラップする
Expression.Lambda は、本文とパラメーターを結び付けて、後でコンパイルできる Expression<TDelegate> を作成します。
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var body = Expression.Add(x, Expression.Constant(1));
var lambda = Expression.Lambda<Func<int, int>>(body, x);
Console.WriteLine(lambda); // x => (x + 1)式をネストして組み合わせる
ファクトリは自由にネストできるため、(x + 1) * 2 のような複雑な式を段階的に構築できます。
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var addOne = Expression.Add(x, Expression.Constant(1));
var timesTwo = Expression.Multiply(addOne, Expression.Constant(2));
Console.WriteLine(timesTwo); // ((x + 1) * 2)メンバーアクセス
Expression.Property と Expression.Field は、メンバーアクセスノードを構築します。
using System;
using System.Linq.Expressions;
var s = Expression.Parameter(typeof(string), "s");
var lengthAccess = Expression.Property(s, "Length");
Console.WriteLine(lengthAccess); // s.Lengthメソッド呼び出し
Expression.Call は、対象、メソッド、引数を指定して呼び出しノードを構築します。
using System;
using System.Linq.Expressions;
var s = Expression.Parameter(typeof(string), "s");
var toUpper = typeof(string).GetMethod("ToUpper", Type.EmptyTypes);
var call = Expression.Call(s, toUpper);
Console.WriteLine(call); // s.ToUpper()構築時の型チェック
ファクトリは構築時にオペランドの型を検証します。型が一致しない場合は直ちに例外をスローするため、早い段階でエラーを検出できます。
using System;
using System.Linq.Expressions;
try {
var bad = Expression.Add(
Expression.Constant(1),
Expression.Constant("text")); // int + string
} catch (InvalidOperationException) {
Console.WriteLine("type mismatch rejected");
}まとめ
x => (x + 1) * 2 というラムダ式を、すべて手動で構築します。
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var body = Expression.Multiply(
Expression.Add(x, Expression.Constant(1)),
Expression.Constant(2));
var lambda = Expression.Lambda<Func<int, int>>(body, x);
Console.WriteLine(lambda); // x => ((x + 1) * 2)クイックチェック
式を手動で構築する方法を確認します。
まとめ
式ツリーを手動で構築する方法を学びました。
Expression.ParameterとExpression.Constantは、リーフノードを作成します。Expression.Addなどは、二項演算を構築します。Expression.PropertyとExpression.Callは、メンバーとメソッドを扱います。Expression.Lambdaは、呼び出し可能なツリーを組み立てます。
よくある質問
「式の手動構築」レッスンは無料ですか?
はい。「式の手動構築」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「式の手動構築」で何を学びますか?
Expression APIで式ツリーを構築します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「式の手動構築」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。