Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 blokowy, zawierający DebugView.
ParametrWyrażenie
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 | długi | L |
System.UInt64 | ulong | UL |
System.Double | podwójny | D |
System.Single | spławik | F |
System.Decimal | dziesiętny | 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, 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
Zaznaczeni operatorzy są wyświetlani z znakiem #
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
*/