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


Синтаксис 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 У
System.Int64 длинный L
System.UInt64 ulong УЛ
System.Double двойной Д
System.Single плавать Ф
System.Decimal десятичное M
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 Объекты отображаются вместе с их типами делегатов.

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