DebugView 语法

DebugView 属性(仅在调试时可用)提供表达式树的字符串呈现。 大多数语法都相当简单明了:以下各节介绍了特殊情况。

每个示例后跟一个包含 DebugView 的块注释。

参数表达式

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 U
System.Int64 L
System.UInt64 ulong UL
System.Double D
System.Single 漂浮 F
System.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 运算符在运算符前面显示 # 符号。 例如,选中的加法运算符显示为 #+

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
*/