DebugView プロパティ (デバッグ時にのみ使用できます) は、式ツリーの文字列レンダリングを提供します。 ほとんどの構文は理解が非常に簡単です。特別なケースについては、次のセクションで説明します。
各例の後に、 DebugView を含むブロック コメントが続きます。
ParameterExpression
ParameterExpression 変数名は、先頭に $
記号と共に表示されます。
パラメーターに名前がない場合は、自動的に生成された名前 ( $var1
や $var2
など) が割り当てられます。
ParameterExpression numParam = Expression.Parameter(typeof(int), "num");
/*
$num
*/
ParameterExpression numParam = Expression.Parameter(typeof(int));
/*
$var1
*/
ConstantExpression
整数値、文字列、およびConstantExpressionを表すnull
オブジェクトの場合、定数の値が表示されます。
標準のサフィックスを C# リテラルとして持つ数値型の場合、サフィックスが値に追加されます。 次の表に、さまざまな数値型に関連付けられているサフィックスを示します。
タイプ | キーワード | 敬称 |
---|---|---|
System.UInt32 | uint を する | ユー |
System.Int64 | 長い | L |
System.UInt64 | ulong | UL規格 |
System.Double | ダブル | D |
System.Single | 浮く | F |
System.Decimal | 小数 | エム |
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 演算子
チェックされた演算子は、演算子の前に #
記号と共に表示されます。 たとえば、チェックされた加算演算子は #+
として表示されます。
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