Ausdrücke (C#-Programmierhandbuch)Expressions (C# Programming Guide)

Ein Ausdruck ist eine Sequenz von einem oder mehr Operanden und null oder mehr Operatoren, die einen einzelnen Wert, ein Objekt, eine Methode oder ein Namespace annehmen können.An expression is a sequence of one or more operands and zero or more operators that can be evaluated to a single value, object, method, or namespace. Ausdrücke können einen literalen Wert, einen Methodenaufruf, einen Operator und die entsprechenden Operanden oder einen einfachen Namen enthalten.Expressions can consist of a literal value, a method invocation, an operator and its operands, or a simple name. Einfache Namen können der Name einer Variablen, eines Typmembers, eines Methodenparameters, eines Namespaces oder eines Typs sein.Simple names can be the name of a variable, type member, method parameter, namespace or type.

Ausdrücke können Operatoren verwenden, die wiederum andere Ausdrücke als Parameter oder Methodenaufrufe verwenden können, deren Parameter wiederum andere Methodenaufrufe darstellen. Ausdrücke können also einfach aber auch sehr komplex sein.Expressions can use operators that in turn use other expressions as parameters, or method calls whose parameters are in turn other method calls, so expressions can range from simple to very complex. Nachstehend sind zwei Beispiele für Ausdrücke:Following are two examples of expressions:

((x < 10) && ( x > 5)) || ((x > 20) && (x < 25));

System.Convert.ToInt32("35");  

AusdruckswerteExpression values

In den meisten Fällen, in denen Ausdrücke verwendet werden, z.B. in Ausdrücken oder Methodenparametern, wird erwartet, dass der Ausdruck einen Wert ergibt.In most of the contexts in which expressions are used, for example in statements or method parameters, the expression is expected to evaluate to some value. Wenn x und y ganze Zahlen sind, ergibt der Ausdruck x + y einen numerischen Wert.If x and y are integers, the expression x + y evaluates to a numeric value. Der Ausdruck new MyClass() ergibt einen Verweis auf einen neue Instanz eines MyClass-Objekts.The expression new MyClass() evaluates to a reference to a new instance of a MyClass object. Der Ausdruck myClass.ToString() ergibt eine Zeichenfolge, da dies der Rückgabetyp der Methode ist.The expression myClass.ToString() evaluates to a string because that is the return type of the method. Obwohl ein Namespacename jedoch als Ausdruck klassifiziert ist, ergibt er keinen Wert und kann deshalb nie das Endergebnis eines Ausdrucks sein.However, although a namespace name is classified as an expression, it does not evaluate to a value and therefore can never be the final result of any expression. Sie können keinen Namespacenamen einem Methodenparameter übergeben oder ihn in einem neuen Ausdruck verwenden bzw. ihn einer Variable zuweisen.You cannot pass a namespace name to a method parameter, or use it in a new expression, or assign it to a variable. Sie können ihn nur als Unterausdruck in einem größeren Ausdruck verwenden.You can only use it as a sub-expression in a larger expression. Das gleiche gilt auch für Typen (im Unterschied zu System.Type-Objekten), Methodengruppennamen (im Unterschied zu bestimmten Methoden) und Ereignisaccessoren add und remove.The same is true for types (as distinct from System.Type objects), method group names (as distinct from specific methods), and event add and remove accessors.

Jeder Wert verfügt über einen zugeordneten Typ.Every value has an associated type. Wenn z.B. x und y jeweils Variablen vom Typ int sind, wird der Wert des Ausdrucks x + y auch als int geschrieben.For example, if x and y are both variables of type int, the value of the expression x + y is also typed as int. Wenn der Wert einer Variable eines anderen Typs zugewiesen ist oder wenn x und y unterschiedliche Typen sind, werden die Regeln der Typkonvertierung angewendet.If the value is assigned to a variable of a different type, or if x and y are different types, the rules of type conversion are applied. Weitere Informationen darüber, wie Konvertierungen funktionieren, finden Sie unter Umwandlung und Typkonvertierungen.For more information about how such conversions work, see Casting and Type Conversions.

ÜberläufeOverflows

Numerische Ausdrücke können zu Überläufen führen, wenn der Wert größer als der Maximalwert des Typs des Werts ist.Numeric expressions may cause overflows if the value is larger than the maximum value of the value's type. Weitere Informationen finden Sie Checked und Unchecked und Tabelle für explizite numerische Konvertierungen.For more information, see Checked and Unchecked and Explicit Numeric Conversions Table.

Operatorrangfolge und AssoziativitätOperator precedence and associativity

Die Art und Weise, wie ein Ausdruck ausgewertet wird, unterliegt den Regeln der Assoziativität und Operatorrangfolge.The manner in which an expression is evaluated is governed by the rules of associativity and operator precedence. Weitere Informationen finden Sie unter Operatoren.For more information, see Operators.

Die meisten Ausdrücke, außer Zuweisungsausdrücke und Methodenaufrufausdrücke, müssen in einer Anweisung eingebettet sein.Most expressions, except assignment expressions and method invocation expressions, must be embedded in a statement. Weitere Informationen finden Sie unter Anweisungen.For more information, see Statements.

Literale und einfache NamenLiterals and simple names

Die zwei einfachsten Typen von Ausdrücken sind Literale und einfache Namen.The two simplest types of expressions are literals and simple names. Ein Literal ist ein konstanter Wert, der keinen Namen besitzt.A literal is a constant value that has no name. Im folgenden Codebeispiel sind z.B. 5 und "Hello World" jeweils Literalwerte:For example, in the following code example, both 5 and "Hello World" are literal values:

// Expression statements.
int i = 5;
string s = "Hello World";

Weitere Informationen zu Literalen finden Sie unter Typen.For more information on literals, see Types.

Im vorherigen Beispiel sind i und s jeweils einfache Namen, die lokale Variablen identifizieren.In the preceding example, both i and s are simple names that identify local variables. Wenn diese Variablen in einem Ausdruck verwendet werden, ergibt der Variablenname einen Wert, der derzeit am Speicherort der Variable im Speicher gespeichert ist.When those variables are used in an expression, the variable name evaluates to the value that is currently stored in the variable's location in memory. Dies wird im folgenden Beispiel gezeigt:This is shown in the following example:

int num = 5;
System.Console.WriteLine(num); // Output: 5
num = 6;
System.Console.WriteLine(num); // Output: 6            

AufrufausdrückeInvocation expressions

Im folgenden Codebeispiel ist der Aufruf von DoWork ein Aufrufausdruck.In the following code example, the call to DoWork is an invocation expression.

DoWork();  

Ein Methodenaufruf erfordert den Namen der Methode entweder als Name wie im vorherigen Beispiel oder als Ergebnis eines anderen Ausdrucks, gefolgt von einer Klammer und beliebigen Methodenparametern.A method invocation requires the name of the method, either as a name as in the previous example, or as the result of another expression, followed by parenthesis and any method parameters. Weitere Informationen finden Sie unter Methoden.For more information, see Methods. Ein Delegataufruf verwendet den Namen eines Delegaten sowie Methodenparameter in Klammern.A delegate invocation uses the name of a delegate and method parameters in parenthesis. Weitere Informationen finden Sie unter Delegaten.For more information, see Delegates. Methodenaufrufe und Delegataufrufe ergeben den Rückgabewert der Methode, wenn die Methode einen Wert zurückgibt.Method invocations and delegate invocations evaluate to the return value of the method, if the method returns a value. Methoden, die „void“ zurückgeben, können nicht anstatt eines Werts in einem Ausdruck verwendet werden.Methods that return void cannot be used in place of a value in an expression.

AbfrageausdrückeQuery expressions

Die gleichen Regeln für Ausdrücke gelten allgemein für Abfrageausdrücke.The same rules for expressions in general apply to query expressions. Weitere Informationen finden Sie unter LINQ-Abfrageausdrücke.For more information, see LINQ Query Expressions.

LambdaausdrückeLambda expressions

Lambdaausdrücke stellen „Inlinemethoden“ dar, die keinen Namen haben, jedoch über Eingabeparameter und mehrere Anweisungen verfügen können.Lambda expressions represent "inline methods" that have no name but can have input parameters and multiple statements. Sie werden häufig in LINQ verwendet, um Argumente Methoden zu übergeben.They are used extensively in LINQ to pass arguments to methods. Lambdaausdrücke werden entweder zu Delegaten oder Ausdrucksbaumstrukturen kompiliert. Dies hängt vom Kontext ab, in dem sie verwendet werden.Lambda expressions are compiled to either delegates or expression trees depending on the context in which they are used. Weitere Informationen finden Sie unter Lambdaausdrücke.For more information, see Lambda Expressions.

AusdrucksbaumstrukturenExpression trees

Mithilfe von Ausdrucksbaumstrukturen können Ausdrücke als Datenstrukturen dargestellt werden.Expression trees enable expressions to be represented as data structures. Sie werden häufig von LINQ-Anbietern verwendet, um Abfrageausdrücke in Code zu übersetzen, der in einem anderen Kontext aussagekräftig ist, z.B. als SQL-Datenbank.They are used extensively by LINQ providers to translate query expressions into code that is meaningful in some other context, such as a SQL database. Weitere Informationen finden Sie unter Ausdrucksbaumstrukturen.For more information, see Expression Trees.

AusdruckstextdefinitionenExpression body definitions

C# unterstützt Ausdruckskörpermember, mit denen Sie eine präzise Ausdrückskörperdefiniton für Methoden, Konstruktoren, Finalizer, Eigenschaften und Indexer angeben können.C# supports expression-bodied members, which allow you to supply a concise expression body definition for methods, constructors, finalizers, properties, and indexers. Weitere Informationen finden Sie unter Ausdruckskörpermember.For more information, see Expression-bodied members.

HinweiseRemarks

Wann immer eine Variable, eine Objekteigenschaft oder ein Objektindexerzugriff von einem Ausdruck identifiziert wird, wird der Wert dieses Elements als Wert des Ausdrucks verwendet.Whenever a variable, object property, or object indexer access is identified from an expression, the value of that item is used as the value of the expression. Ein Ausdruck kann dort in C# platziert werden, wo ein Wert oder Objekt benötigt wird, solange der Ausdruck letztendlich den geforderten Typ ergibt.An expression can be placed anywhere in C# where a value or object is required, as long as the expression ultimately evaluates to the required type.

Siehe auchSee also

C#-ProgrammierhandbuchC# Programming Guide
MethodenMethods
DelegatenDelegates
OperatorenOperators
TypenTypes
LINQ-AbfrageausdrückeLINQ Query Expressions