Debuggen von Ausdrucksbäumen in Visual Studio (C#)Debugging Expression Trees in Visual Studio (C#)

Sie können die Struktur und den Inhalt von Ausdrucksbaumstrukturen beim Debuggen Ihrer Anwendung analysieren.You can analyze the structure and content of expression trees when you debug your applications. Um einen schnellen Überblick über die Ausdrucksbaumstruktur zu erhalten, können Sie die DebugView-Eigenschaft verwenden, die nur im Debugmodus verfügbar ist.To get a quick overview of the expression tree structure, you can use the DebugView property, which is available only in debug mode. Weitere Informationen zum Debugging finden Sie unter Debuggen in Visual Studio.For more information about debugging, see Debugging in Visual Studio.

Die DebugView-Eigenschaft stellt den Inhalt von Ausdrucksbaumstrukturen mithilfe von Visual Studio-Schnellansichten übersichtlicher dar.To better represent the content of expression trees, the DebugView property uses Visual Studio visualizers. Weitere Informationen finden Sie unter Create Custom Visualizers (Erstellen benutzerdefinierter Schnellansichten).For more information, see Create Custom Visualizers.

So öffnen Sie eine Schnellansicht für eine AusdrucksbaumstrukturTo open a visualizer for an expression tree

  1. Klicken Sie auf das Lupensymbol, das in DataTips neben der DebugView-Eigenschaft einer Ausdrucksbaumstruktur, neben einem Überwachungsfenster, einem Auto- oder neben einem Lokalfenster angezeigt wird.Click the magnifying glass icon that appears next to the DebugView property of an expression tree in DataTips, a Watch window, the Autos window, or the Locals window.

    Eine Liste von Schnellansichten wird angezeigt.A list of visualizers is displayed.

  2. Klicken Sie auf die gewünschte Schnellansicht.Click the visualizer you want to use.

Jeder Ausdruckstyp wird in der Schnellansicht angezeigt, wie in den folgenden Abschnitten beschrieben.Each expression type is displayed in the visualizer as described in the following sections.

ParameterExpressionsParameterExpressions

Namen von ParameterExpression-Variablen werden mit einem „$“-Symbol am Anfang angezeigt.ParameterExpression variable names are displayed with a "$" symbol at the beginning.

Wenn ein Parameter nicht über einen Namen verfügt, wird ihm ein automatisch generierter Name zugewiesen, z.B. $var1 oder $var2.If a parameter does not have a name, it is assigned an automatically generated name, such as $var1 or $var2.

BeispieleExamples

AusdruckExpression DebugView-EigenschaftDebugView property
ParameterExpression numParam = Expression.Parameter(typeof(int), "num"); $num
ParameterExpression numParam = Expression.Parameter(typeof(int)); $var1

ConstantExpressionsConstantExpressions

Für ConstantExpression-Objekte, die ganzzahlige Werte, Zeichenfolgen und null darstellen, wird der Wert der Konstante angezeigt.For ConstantExpression objects that represent integer values, strings, and null, the value of the constant is displayed.

Für numerische Typen, die über Standardsuffixe als C#-Literale verfügen, wird das Suffix zum Wert hinzugefügt.For numeric types that have standard suffixes as C# literals, the suffix is added to the value. Die folgende Tabelle zeigt die verschiedenen numerischen Typen und ihre zugeordneten Suffixe.The following table shows the suffixes associated with various numeric types.

TypType SuffixSuffix
UInt32 UU
Int64 LL
UInt64 ULUL
Double DD
Single FF
Decimal MM

BeispieleExamples

AusdruckExpression DebugView-EigenschaftDebugView property
int num = 10; ConstantExpression expr = Expression.Constant(num); 1010
double num = 10; ConstantExpression expr = Expression.Constant(num); 10D10D

BlockExpressionBlockExpression

Wenn sich der Typ eines BlockExpression-Objekts vom Typ des letzten Ausdrucks im Block unterscheidet, wird der Typ in der DebugInfo-Eigenschaft in spitzen Klammern (< und >) angezeigt.If the type of a BlockExpression object differs from the type of the last expression in the block, the type is displayed in the DebugInfo property in angle brackets (< and >). Andernfalls wird der Typ des BlockExpression-Objekts nicht angezeigt.Otherwise, the type of the BlockExpression object is not displayed.

BeispieleExamples

AusdruckExpression DebugView-EigenschaftDebugView property
BlockExpression block = Expression.Block(Expression.Constant("test")); .Block() {

"test"

}
BlockExpression block = Expression.Block(typeof(Object), Expression.Constant("test")); .Block<System.Object>() {

"test"

}

LambdaExpression.LambdaExpression

LambdaExpression-Objekte werden zusammen mit ihren Delegattypen angezeigt.LambdaExpression objects are displayed together with their delegate types.

Wenn ein Lambda-Ausdruck über keinen Namen verfügt, wird ihm ein automatisch generierter Name zugewiesen, z.B. #Lambda1 oder #Lambda2.If a lambda expression does not have a name, it is assigned an automatically generated name, such as #Lambda1 or #Lambda2.

BeispieleExamples

AusdruckExpression DebugView-EigenschaftDebugView property
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

}

LabelExpressionLabelExpression

Wenn Sie einen Standardwert für das LabelExpression-Objekt angeben, wird dieser Wert vor dem LabelTarget-Objekt angezeigt.If you specify a default value for the LabelExpression object, this value is displayed before the LabelTarget object.

Das .Label-Token gibt den Anfang der Bezeichnung an.The .Label token indicates the start of the label. Das .LabelTarget-Token gibt den Zielort an, zu dem gewechselt werden soll.The .LabelTarget token indicates the destination of the target to jump to.

Wenn eine Bezeichnung nicht über einen Namen verfügt, wird ihr ein automatisch generierter Name zugewiesen (z.B. #Label1 oder #Label2).If a label does not have a name, it is assigned an automatically generated name, such as #Label1 or #Label2.

BeispieleExamples

AusdruckExpression DebugView-EigenschaftDebugView property
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(target5), Expression.Label(target5)); .Block() {

.Goto #Label1 { };

.Label

.LabelTarget #Label1:

}

Überprüfte OperatorenChecked Operators

Überprüften Operatoren wird in der Ansicht das Symbol "#" vorangestellt.Checked operators are displayed with the "#" symbol in front of the operator. Der überprüfte Additionsoperator wird z.B. als #+ angezeigt.For example, the checked addition operator is displayed as #+.

BeispieleExamples

AusdruckExpression DebugView-EigenschaftDebugView property
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

Siehe auchSee Also

Ausdrucksbaumstrukturen (C#)Expression Trees (C#)
Debuggen in Visual StudioDebugging in Visual Studio
Erstellen benutzerdefinierter SchnellansichtenCreate Custom Visualizers