Udostępnij za pośrednictwem


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
*/