Syntaxe DebugView
Vlastnost DebugView (k dispozici pouze při ladění) poskytuje řetězcové vykreslování stromů výrazů. Většina syntaxe je poměrně jednoduchá pro pochopení; zvláštní případy jsou popsány v následujících částech.
Každý příklad následuje blokový komentář, který obsahuje DebugView.
Parameterexpression
ParameterExpression Názvy proměnných se zobrazují se $
symbolem na začátku.
Pokud parametr nemá název, přiřadí se mu automaticky vygenerovaný název, například $var1
nebo $var2
.
ParameterExpression numParam = Expression.Parameter(typeof(int), "num");
/*
$num
*/
ParameterExpression numParam = Expression.Parameter(typeof(int));
/*
$var1
*/
Constantexpression
Pro ConstantExpression objekty, které představují celočíselné hodnoty, řetězce a null
, se zobrazí hodnota konstanty.
Pro číselné typy, které mají standardní přípony jako literály jazyka C#, se přípona přidá k hodnotě. Následující tabulka uvádí přípony přidružené k různým číselným typům.
Typ | Klíčové slovo | Přípona |
---|---|---|
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
Pokud se typ objektu BlockExpression liší od typu posledního výrazu v bloku, typ se zobrazí v úhlových závorkách (<
a >
). V opačném případě se typ objektu BlockExpression nezobrazí.
BlockExpression block = Expression.Block(Expression.Constant("test"));
/*
.Block() {
"test"
}
*/
BlockExpression block = Expression.Block(typeof(Object), Expression.Constant("test"));
/*
.Block<System.Object>() {
"test"
}
*/
LambdaExpression
LambdaExpression objekty se zobrazují společně s jejich typy delegátů.
Pokud výraz lambda nemá název, přiřadí se mu automaticky vygenerovaný název, například #Lambda1
nebo #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
Pokud zadáte výchozí hodnotu objektu LabelExpression , zobrazí se tato hodnota před objektem LabelTarget .
Token .Label
označuje začátek popisku. Token .LabelTarget
označuje cíl cíle, na který se má přejít.
Pokud popisek nemá název, přiřadí se mu automaticky vygenerovaný název, například #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:
}
*/
Zaškrtnuté operátory
Zaškrtnuté operátory se zobrazí se #
symbolem před operátorem. Například, zaškrtnutý operátor sčítání se zobrazí jako #+
.
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
*/