表达式树(五)【在 Visual Studio 中调试表达式树 (C#)】

可以在调试应用程序时分析表达式树的结构和内容。 若要快速了解表达式树结构,可以使用 DebugView 属性,该属性仅在调试模式下可用。
在这里插入图片描述
为了更好地表示表达式树的内容,DebugView 属性使用 Visual Studio 可视化工具。

打开表达式树的可视化工具

  1. 单击“数据提示”、“监视”窗口、“自动”或“局部变量”窗口中表达式树的 DebugView 属性旁边显示的放大镜图标。

    将会显示可视化工具列表。
    在这里插入图片描述

  2. 单击要使用的可视化工具。

每个表达式类型如以下各节所述显示在可视化工具中。

ParameterExpressions

System.Linq.Expressions.ParameterExpression 变量名称的开头显示有“$”符号。

如果参数没有名称,则会为其分配一个自动生成的名称,例如 $var1$var2

示例

ExpressionDebugView 属性
ParameterExpression numParam = Expression.Parameter(typeof(int), "num");$num
ParameterExpression numParam = Expression.Parameter(typeof(int));$var1

ConstantExpressions

对于表示整数值、字符串和 nullSystem.Linq.Expressions.ConstantExpression 对象,将显示常数的值。

对于使用标准后缀作为 C# 原义字符的数值类型,将后缀添加到值。 下表显示与各种数值类型关联的后缀。

类型后缀
System.UInt32U
System.Int64L
System.UInt64UL
System.DoubleD
System.SingleF
System.DecimalM

示例

ExpressionDebugView 属性
int num = 10; ConstantExpression expr = Expression.Constant(num);10
double num = 10; ConstantExpression expr = Expression.Constant(num);10D

BlockExpression

如果 System.Linq.Expressions.BlockExpression 对象的类型与块中最后一个表达式的类型不同,则该类型将显示在 DebugInfo 属性中的尖括号(<>)中。 否则,将不显示 System.Linq.Expressions.BlockExpression 对象的类型。

示例

ExpressionDebugView 属性
BlockExpression block = Expression.Block(Expression.Constant("test"));.Block() {

"test"

}
BlockExpression block = Expression.Block(typeof(Object), Expression.Constant("test"));.Block<System.Object>() {

"test"

}

LambdaExpression

显示 System.Linq.Expressions.LambdaExpression 对象及其委托类型。
如果 lambda 表达式没有名称,则会为其分配一个自动生成的名称,例如 #Lambda1#Lambda2

示例

ExpressionDebugView 属性
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

如果指定 System.Linq.Expressions.LabelExpression 对象的默认值,则在 System.Linq.Expressions.LabelTarget 对象之前显示此值。

.Label 令牌指示标签的开头。 .LabelTarget 令牌指示要跳转到的目标的目的地。

如果标签没有名称,则会为其分配一个自动生成的名称,例如 #Label1#Label2

示例

ExpressionDebugView 属性
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(target5), Expression.Label(target5));.Block() {

.Goto #Label1 { };

.Label

.LabelTarget #Label1:

}

Checked 运算符

Checked 运算符在运算符前面显示 “#” 符号。 例如,checked 加号显示为 #+

示例

ExpressionDebugView 属性
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值