Поделиться через


Синтаксис DebugView

Свойство DebugView (доступно только при отладке) предоставляет строковое представление деревьев выражений. Большая часть синтаксиса достаточно проста для понимания; особые случаи описаны в разделах ниже.

Каждый пример сопровождается комментарием с DebugView.

ParameterExpression

В начале имен переменных ParameterExpression отображается символ $.

Если параметр не имеет имени, он назначается автоматически созданное имя, например $var1 или $var2.

ParameterExpression numParam =  Expression.Parameter(typeof(int), "num");
/*
    $num
*/

ParameterExpression numParam =  Expression.Parameter(typeof(int));
/*
    $var1
*/

ConstantExpression

Для объектов ConstantExpression, представляющих целочисленные значения, строки и null, отображается значение константы.

Для числовых типов, имеющих стандартные суффиксы, такие как литералы C#, суффикс добавляется к значению. В следующей таблице показаны суффиксы для различных числовых типов.

Тип Ключевое слово Суффикс
System.UInt32 uint U
System.Int64 long L
System.UInt64 ulong UL
System.Double double D
System.Single float F
System.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 отображаются вместе со своими типами делегатов.

Если лямбда-выражение не имеет имени, оно назначается автоматически созданное имя, например #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
*/