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# 原义字符的数值类型,将后缀添加到值。 下表显示与各种数值类型关联的后缀。
类型 | 关键字 | Suffix |
---|---|---|
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 对象及其委托类型。
如果 Lambda 表达式没有名称,则会为它分配一个自动生成的名称,例如 #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
*/