Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Свойство 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
*/