DebugView の構文
DebugView プロパティ (デバッグ時にのみ利用可能) を指定すると、式ツリーが文字列でレンダリングされます。 構文の大部分はかなりわかりやすいです。特別なケースについて以降のセクションで説明します。
各例の後に、DebugView を含むブロック コメントが示されています。
ParameterExpression
ParameterExpression 変数名は、先頭に記号 $
を付けて表示されます。
パラメーターに名前がない場合、$var1
や $var2
など、自動的に生成された名前が割り当てられます。
ParameterExpression numParam = Expression.Parameter(typeof(int), "num");
/*
$num
*/
ParameterExpression numParam = Expression.Parameter(typeof(int));
/*
$var1
*/
ConstantExpression
整数値、文字列、および null
を表す ConstantExpression オブジェクトの場合、定数の値が表示されます。
C# リテラルとしての標準のサフィックスを持つ数値型の場合、サフィックスが値に追加されます。 さまざまな数値型に関連するサフィックスを次の表に示します。
種類 | キーワード | サフィックス |
---|---|---|
System.UInt32 | uint | U |
System.Int64 | long | L |
System.UInt64 | ulong | UL |
System.Double | double | D |
System.Single | float | F |
System.Decimal | decimal | M |
int num = 10;
ConstantExpression expr = Expression.Constant(num);
/*
10
*/
double num = 10;
ConstantExpression expr = Expression.Constant(num);
/*
10D
*/
BlockExpression
BlockExpression オブジェクトの型がブロック内の最後の式の型と異なる場合、その型が山かっこ (<
と >
) 内に表示されます。 それ以外の場合、BlockExpression オブジェクトの型は表示されません。
BlockExpression block = Expression.Block(Expression.Constant("test"));
/*
.Block() {
"test"
}
*/
BlockExpression block = Expression.Block(typeof(Object), Expression.Constant("test"));
/*
.Block<System.Object>() {
"test"
}
*/
LambdaExpression
LambdaExpression オブジェクトは、デリゲート型と共に表示されます。
ラムダ式に名前がない場合、#Lambda1
や #Lambda2
など、自動的に生成された名前が割り当てられます。
LambdaExpression lambda = Expression.Lambda<Func<int>>(Expression.Constant(1));
/*
.Lambda #Lambda1<System.Func'1[System.Int32]>() {
1
}
*/
LambdaExpression lambda = Expression.Lambda<Func<int>>(Expression.Constant(1), "SampleLambda", null);
/*
.Lambda #SampleLambda<System.Func'1[System.Int32]>() {
1
}
*/
LabelExpression
LabelExpression オブジェクトの既定値を指定した場合、その値が LabelTarget オブジェクトの前に表示されます。
.Label
トークンは、ラベルの開始を示します。 .LabelTarget
トークンは、ジャンプ先のターゲットを示します。
ラベルに名前がない場合、#Label1
や #Label2
など、自動的に生成された名前が割り当てられます。
LabelTarget target = Expression.Label(typeof(int), "SampleLabel");
BlockExpression block = Expression.Block(
Expression.Goto(target, Expression.Constant(0)),
Expression.Label(target, Expression.Constant(-1))
);
/*
.Block() {
.Goto SampleLabel { 0 };
.Label
-1
.LabelTarget SampleLabel:
}
*/
LabelTarget target = Expression.Label();
BlockExpression block = Expression.Block(
Expression.Goto(target),
Expression.Label(target)
);
/*
.Block() {
.Goto #Label1 { };
.Label
.LabelTarget #Label1:
}
*/
checked 演算子
checked 演算子は、演算子の前に #
記号が付く形式で表示されます。 たとえば、checked 加算演算子は #+
と表示されます。
Expression expr = Expression.AddChecked( Expression.Constant(1), Expression.Constant(2));
/*
1 #+ 2
*/
Expression expr = Expression.ConvertChecked( Expression.Constant(10.0), typeof(int));
/*
#(System.Int32)10D
*/
.NET