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 | 月 |
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:
}
*/
檢查的運算子
顯示檢查的運算子時,運算子前面會有 #
符號。 例如,已檢查的加法運算子會顯示為 #+
。
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
*/