Sintaxis de DebugView
La propiedad DebugView (disponible solo durante la depuración) proporciona una representación de cadenas de árboles de expresión. La mayor parte de la sintaxis es bastante sencilla de entender; los casos especiales se describen en las siguientes secciones.
Cada ejemplo va seguido de un comentario del bloque, que contiene DebugView.
ParameterExpression
los nombres de variable ParameterExpression se muestran con un símbolo $
al principio.
Si un parámetro no tiene un nombre, se le asigna un nombre generado automáticamente, como $var1
o $var2
.
ParameterExpression numParam = Expression.Parameter(typeof(int), "num");
/*
$num
*/
ParameterExpression numParam = Expression.Parameter(typeof(int));
/*
$var1
*/
ConstantExpression
Para los objetos ConstantExpression que representan valores enteros, cadenas y null
, se muestra el valor de la constante.
Para los tipos numéricos que tienen sufijos estándar como literales de C#, el sufijo se agrega al valor. En la tabla siguiente se muestran los sufijos asociados a varios tipos numéricos.
Tipo | Palabra clave | Sufijo |
---|---|---|
System.UInt32 | uint | U |
System.Int64 | long | L |
System.UInt64 | ulong | UL |
System.Double | double | D |
System.Single | float | F |
System.Decimal | decimal | M |
int num = 10;
ConstantExpression expr = Expression.Constant(num);
/*
10
*/
double num = 10;
ConstantExpression expr = Expression.Constant(num);
/*
10D
*/
BlockExpression
Si el tipo de un objeto BlockExpression difiere del tipo de la última expresión del bloque, el tipo se muestra entre corchetes angulares (<
y >
). De otro modo, el tipo del objeto BlockExpression no se muestra.
BlockExpression block = Expression.Block(Expression.Constant("test"));
/*
.Block() {
"test"
}
*/
BlockExpression block = Expression.Block(typeof(Object), Expression.Constant("test"));
/*
.Block<System.Object>() {
"test"
}
*/
LambdaExpression
Los objetos LambdaExpression se muestran junto con sus tipos delegados.
Si una expresión lambda no tiene un nombre, se le asigna un nombre generado automáticamente, como #Lambda1
o #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
Si especifica un valor predeterminado para el objeto LabelExpression, este valor se muestra antes del objeto LabelTarget.
El token .Label
indica el inicio de la etiqueta. El token .LabelTarget
indica el destino al que se va a saltar.
Si una etiqueta no tiene un nombre, se le asigna un nombre generado automáticamente, como #Label1
o #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 activados
Los operadores activados se muestran con el símbolo #
delante del operador. Por ejemplo, el operador de adición activado se muestra 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
*/