Sintaxe DebugView
A propriedade DebugView (disponível somente durante a depuração) fornece uma renderização de cadeia de caracteres de árvores de expressão. A maior parte da sintaxe é bastante simples de entender; Os casos especiais são descritos nas secções seguintes.
Cada exemplo é seguido por um comentário de bloco, contendo o DebugView.
ParameterExpression
ParameterExpression Os nomes das variáveis são exibidos com um $
símbolo no início.
Se um parâmetro não tiver um nome, será atribuído um nome gerado automaticamente, como $var1
ou $var2
.
ParameterExpression numParam = Expression.Parameter(typeof(int), "num");
/*
$num
*/
ParameterExpression numParam = Expression.Parameter(typeof(int));
/*
$var1
*/
ConstantExpression
Para ConstantExpression objetos que representam valores inteiros, cadeias de caracteres e null
, o valor da constante é exibido.
Para tipos numéricos que têm sufixos padrão como literais C#, o sufixo é adicionado ao valor. A tabela a seguir mostra os sufixos associados a vários tipos numéricos.
Type | Palavra-chave | Sufixo |
---|---|---|
System.UInt32 | uint | U |
System.Int64 | Longo | L |
System.UInt64 | Ulong | UL |
System.Double | duplo | D |
System.Single | flutuar | F |
System.Decimal | decimal | Seg |
int num = 10;
ConstantExpression expr = Expression.Constant(num);
/*
10
*/
double num = 10;
ConstantExpression expr = Expression.Constant(num);
/*
10D
*/
BlockExpression
Se o tipo de um BlockExpression objeto for diferente do tipo da última expressão no bloco , o tipo será exibido entre colchetes angulares (<
e >
). Caso contrário, o BlockExpression tipo do objeto não será exibido.
BlockExpression block = Expression.Block(Expression.Constant("test"));
/*
.Block() {
"test"
}
*/
BlockExpression block = Expression.Block(typeof(Object), Expression.Constant("test"));
/*
.Block<System.Object>() {
"test"
}
*/
LambdaExpression
LambdaExpression Os objetos são exibidos juntamente com seus tipos de delegados.
Se uma expressão lambda não tiver um nome, será atribuído um nome gerado automaticamente, como #Lambda1
ou #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
Se você especificar um valor padrão para o LabelExpression objeto, esse valor será exibido antes do LabelTarget objeto.
O .Label
token indica o início do rótulo. O .LabelTarget
token indica o destino do destino para o qual saltar.
Se um rótulo não tiver um nome, será atribuído um nome gerado automaticamente, como #Label1
ou #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:
}
*/
Operadores verificados
Os operadores verificados são exibidos com o #
símbolo na frente do operador. Por exemplo, o operador de adição verificada é exibido como #+
.
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
*/