Składnia elementu DebugView
Właściwość DebugView (dostępna tylko podczas debugowania) udostępnia renderowanie ciągów drzew wyrażeń. Większość składni jest dość prosta do zrozumienia; w poniższych sekcjach opisano przypadki specjalne.
Po każdym przykładzie następuje komentarz bloku zawierający widok DebugView.
Parameterexpression
ParameterExpression nazwy zmiennych są wyświetlane z symbolem $
na początku.
Jeśli parametr nie ma nazwy, zostanie przypisana automatycznie wygenerowana nazwa, na przykład $var1
lub $var2
.
ParameterExpression numParam = Expression.Parameter(typeof(int), "num");
/*
$num
*/
ParameterExpression numParam = Expression.Parameter(typeof(int));
/*
$var1
*/
ConstantExpression
W przypadku ConstantExpression obiektów reprezentujących wartości całkowite, ciągi i null
, wyświetlana jest wartość stałej.
W przypadku typów liczbowych, które mają standardowe sufiksy jako literały języka C#, sufiks jest dodawany do wartości. W poniższej tabeli przedstawiono sufiksy skojarzone z różnymi typami liczbowymi.
Typ | Słowo kluczowe | Sufiks |
---|---|---|
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
Jeśli typ BlockExpression obiektu różni się od typu ostatniego wyrażenia w bloku, typ jest wyświetlany w nawiasach kątowych (<
i >
). W przeciwnym razie typ BlockExpression obiektu nie jest wyświetlany.
BlockExpression block = Expression.Block(Expression.Constant("test"));
/*
.Block() {
"test"
}
*/
BlockExpression block = Expression.Block(typeof(Object), Expression.Constant("test"));
/*
.Block<System.Object>() {
"test"
}
*/
Lambdaexpression
LambdaExpression obiekty są wyświetlane razem z ich typami delegatów.
Jeśli wyrażenie lambda nie ma nazwy, ma przypisaną automatycznie wygenerowaną nazwę, taką jak #Lambda1
lub #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
Jeśli określisz wartość domyślną dla LabelExpression obiektu, ta wartość zostanie wyświetlona przed obiektem LabelTarget .
Token .Label
wskazuje początek etykiety. Token .LabelTarget
wskazuje miejsce docelowe obiektu docelowego, do którego ma przejść.
Jeśli etykieta nie ma nazwy, zostanie przypisana automatycznie wygenerowana nazwa, na przykład #Label1
lub #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:
}
*/
Sprawdzone operatory
Zaznaczone operatory są wyświetlane z symbolem #
przed operatorem. Na przykład sprawdzony operator dodawania jest wyświetlany 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
*/