Синтаксис 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
*/