Freigeben über


Ausdrücke (C#-Programmierhandbuch)

Aktualisiert: Juli 2008

Ein Ausdruck ist eine Folge von mindestens einem Operanden und optionalen Operatoren, die zu einem einzelnen Wert, einem einzelnen Objekt, einer einzelnen Methode oder einem einzelnen Namespace ausgewertet werden kann. Ausdrücke können aus einem literalen Wert, einem Methodenaufruf, einem Operator und dessen Operanden oder einem einfachen Namen bestehen. Einfache Namen können der Name einer Variablen bzw. eines Typmembers, Methodenparameters, Namespaces oder Typs sein.

Ausdrücke können Operatoren verwenden. Diese können wiederum andere Ausdrücke als Parameter oder Methodenaufrufe verwenden, deren Parameter wiederum andere Methodenaufrufe darstellen. Die Bandbreite der möglichen Ausdrücke reicht also von einfach bis sehr komplex. Im Folgenden sind zwei Beispiele für Ausdrücke aufgeführt:

((x < 10) && ( x > 5)) || ((x > 20) && (x < 25)) 
System.Convert.ToInt32("35")

Ausdruckswerte

In den meisten Zusammenhängen, in denen Ausdrücke verwendet werden, beispielsweise in Anweisungen oder Methodenparametern, muss der Ausdruck zu einem Wert ausgewertet werden. Wenn x und y ganze Zahlen sind, ergibt der Ausdruck x + y einen numerischen Wert. Der Ausdruck new MyClass() wird zu einem Verweis auf eine neue Instanz eines MyClass-Objekts ausgewertet. Der Ausdruck myClass.ToString() wird zu einer Zeichenfolge ausgewertet, da dies der Rückgabetyp der Methode ist. Auch wenn ein Namespacename als Ausdruck klassifiziert ist, wird dieser jedoch nicht zu einem Wert ausgewertet und kann daher nicht als Endergebnis eines Ausdrucks auftreten. Ein Namespacename kann nicht einem Methodenparameter übergeben, in einem neuen Ausdruck verwendet oder einer Variablen zugewiesen werden. Er kann nur als Unterausdruck in einem größeren Ausdruck verwendet werden. Das Gleiche gilt für Typen (im Unterschied zu System.Type-Objekten), Methodengruppennamen (im Unterschied zu spezifischen Methoden) sowie add-Ereignisaccessoren und remove-Ereignisaccessoren.

Jeder Wert verfügt über einen zugeordneten Typ. Wenn beispielsweise x und y Variablen vom Typ int sind, wird der Wert des Ausdrucks x + y ebenfalls als int typisiert. Wenn der Wert einer Variablen eines anderen Typs zugewiesen wird, oder wenn x und y von unterschiedlichen Typen sind, werden die Regeln der Typkonvertierung angewendet. Weitere Informationen über die Funktionsweise solcher Konvertierungen finden Sie unter Umwandlung und Typkonvertierungen (C#-Programmierhandbuch).

Überläufe

Numerische Ausdrücke können Überläufe zur Folge haben, wenn ihr Wert größer ist als der maximale Wert des Typs des Werts. Weitere Informationen finden Sie unter Checked und Unchecked (C#-Referenz) und unter Tabelle für explizite numerische Konvertierungen (C#-Referenz).

Operatorrangfolge und Assoziativität

Die Auswertung eines Ausdrucks wird durch die Regeln der Assoziativität und der Operatorrangfolge bestimmt. Weitere Informationen hierzu finden Sie unter Operatoren (C#-Programmierhandbuch).

Die meisten Ausdrücke, mit Ausnahme von Zuweisungsausdrücken und Ausdrücken für Methodenaufrufe, müssen in eine Anweisung eingebettet werden. Weitere Informationen hierzu finden Sie unter Anweisungen (C#-Programmierhandbuch).

Literale und einfache Namen

Die zwei einfachsten Typen von Ausdrücken sind Literale und einfache Namen. Ein Literal ist ein konstanter Wert, der keinen Namen hat. Im folgenden Codebeispiel sind sowohl 5 als auch "Hello World" literale Werte:

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

Weitere Informationen zu literalen Werten finden Sie unter Typen (C#-Referenz).

Im vorhergehenden Beispiel sind sowohl i als auch s einfache Namen, die lokale Variablen identifizieren. Wenn diese Variablen in einem Ausdruck verwendet werden, wird der Name der Variablen zum aktuell am Speicherort der Variablen gespeicherten Wert ausgewertet. Dies wird im folgenden Beispiel dargestellt:

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

Aufrufausdrücke

Im folgenden Codebeispiel ist der Aufruf von DoWork ein Aufrufausdruck.

DoWork();

Für einen Methodenaufruf werden der Name der Methode (entweder als Name wie im vorigen Beispiel oder als Ergebnis eines anderen Ausdrucks) und eine Klammer mit allen Methodenparametern benötigt. Weitere Informationen finden Sie unter Methoden (C#-Programmierhandbuch). Ein Delegataufruf verwendet den Namen des Delegaten mit den Methodenparametern in Klammern. Weitere Informationen finden Sie unter Delegaten (C#-Programmierhandbuch). Wenn die Methode einen Wert zurückgibt, wertet der Methodenaufruf bzw. der Delegataufruf den Rückgabewert der Methode aus. Methoden, die void zurückgeben, können in einem Ausdruck nicht anstelle eines Werts verwendet werden.

Abfrageausdrücke

Die gleichen Regeln für Ausdrücke gelten im Allgemeinen für Abfrageausdrücke. Weitere Informationen finden Sie unter LINQ-Abfrageausdrücke (C#-Programmierhandbuch).

Lambda-Ausdrücke

Lambda-Ausdrücke stellen "Inlinemethoden" dar, die keinen Namen haben, aber Eingabeparameter und mehrere Anweisungen umfassen können. Sie werden häufig in LINQ verwendet, um Argumente an Methoden zu übergeben. Lambda-Ausdrücke werden, je nach dem Kontext, in dem sie verwendet werden, entweder zu Delegaten oder Ausdrucksbaumstrukturen kompiliert. Weitere Informationen finden Sie unter Lambda-Ausdrücke (C#-Programmierhandbuch).

Ausdrucksbaumstrukturen

Ausdrucksbaumstrukturen aktivieren Ausdrücke, um als Datenstrukturen dargestellt zu werden. Sie werden häufig von LINQ-Anbietern zum Übersetzen von Abfrageausdrücken in für andere Kontexte, z. B. eine SQL-Datenbank, verständlichen Code verwendet. Weitere Informationen finden Sie unter Ausdrucksbaumstrukturen.

Hinweise

Wenn in einem Ausdruck eine Variable, ein Objekteigenschaftenzugriff oder ein Objektindexerzugriff erkannt wird, wird der Wert dieses Elements als Wert des Ausdrucks verwendet. In C# kann ein Ausdruck an jeder Stelle positioniert sein, an der ein Wert oder Objekt erwartet wird, solange der Ausdruck letztlich zu dem erforderlichen Typ ausgewertet wird.

Siehe auch

Konzepte

C#-Programmierhandbuch

LINQ-Abfrageausdrücke (C#-Programmierhandbuch)

Referenz

Methoden (C#-Programmierhandbuch)

Delegaten (C#-Programmierhandbuch)

Operatoren (C#-Programmierhandbuch)

Typen (C#-Programmierhandbuch)

Änderungsprotokoll

Date

Versionsgeschichte

Grund

Juli 2008

Einführung verbessert und die Abschnitte "Ausdruckswerte", "Überläufe" und "Operatorrangfolge und Assoziativität" hinzugefügt.

Informationsergänzung.