C#-Operatoren und -Ausdrücke (C#-Referenz)

C# bietet viele verschiedene Operatoren. Viele dieser Operatoren werden von den integrierten Typen unterstützt und ermöglichen es Ihnen, grundlegende Vorgänge mit den Werten dieser Typen auszuführen. Diese Operatoren sind in folgende Gruppen unterteilt:

In der Regel können Sie diese Operatoren überladen, also das Operatorverhalten für die Operanden eines benutzerdefinierten Typs angeben.

Die einfachsten C#-Ausdrücke sind Literale (zum Beispiel Integer und reelle Zahlen) sowie Namen von Variablen. Sie können diese mithilfe von Operatoren in komplexen Ausdrücken kombinieren. Die Operatorrangfolge und -assoziativität legen die Reihenfolge fest, in der die Vorgänge in einem Ausdruck durchgeführt werden. Sie können Klammern verwenden, um die Reihenfolge der Auswertung zu ändern, die durch die Operatorrangfolge und -assoziativität festgelegt wird.

Im folgenden Code befinden sich die Beispiele der Ausdrücke auf der rechten Seite der Zuweisungen:

int a, b, c;
a = 7;
b = a;
c = b++;
b = a + b * c;
c = a >= 100 ? b : c / 10;
a = (int)Math.Sqrt(b * b + c * c);

string s = "String literal";
char l = s[s.Length - 1];

var numbers = new List<int>(new[] { 1, 2, 3 });
b = numbers.FindLast(n => n > 1);

In der Regel erzeugt ein Ausdruck ein Ergebnis und kann in einen anderen Ausdruck eingeschlossen werden. Ein void-Methodenaufruf ist ein Beispiel eines Ausdrucks, der kein Ergebnis erzeugt. Er kann nur als Anweisung wie im folgenden Beispiel verwendet werden.

Console.WriteLine("Hello, world!");

Im Folgenden finden Sie einige weitere Ausdrücke, die von C# bereitgestellt werden:

  • Interpolierte Zeichenfolgenausdrücke, die eine bequeme Syntax zum Erstellen formatierter Zeichenfolgen bereitstellen:

    var r = 2.3;
    var message = $"The area of a circle with radius {r} is {Math.PI * r * r:F3}.";
    Console.WriteLine(message);
    // Output:
    // The area of a circle with radius 2.3 is 16.619.
    
  • Lambdaausdrücke, mit denen Sie anonyme Funktionen erstellen können:

    int[] numbers = { 2, 3, 4, 5 };
    var maximumSquare = numbers.Max(x => x * x);
    Console.WriteLine(maximumSquare);
    // Output:
    // 25
    
  • Abfrageausdrücke, mit denen Sie Abfragefunktionen direkt in C# verwenden können:

    var scores = new[] { 90, 97, 78, 68, 85 };
    IEnumerable<int> highScoresQuery =
        from score in scores
        where score > 80
        orderby score descending
        select score;
    Console.WriteLine(string.Join(" ", highScoresQuery));
    // Output:
    // 97 90 85
    

Sie können eine Ausdruckskörperfunktion verwenden, um eine präzise Definition für eine Methode, einen Konstruktor, eine Eigenschaft, einen Indexer oder einen Finalizer bereitzustellen.

Operatorrangfolge

In einem Ausdruck mit mehreren Operatoren werden die Operatoren mit höherer Rangfolge vor den Operatoren mit niedrigerer Rangfolge ausgewertet. Im folgenden Beispiel wird die Multiplikation zuerst durchgeführt, da Sie eine höhere Rangfolge aufweist als die Addition:

var a = 2 + 2 * 2;
Console.WriteLine(a); //  output: 6

Verwenden Sie Klammern, um die Reihenfolge der Auswertung zu ändern, die durch die Operatorrangfolge festgelegt ist:

var a = (2 + 2) * 2;
Console.WriteLine(a); //  output: 8

Die folgende Tabelle listen die C#-Operatoren auf, und zwar von der höchsten zur niedrigsten Rangfolge. Die Operatoren in jeder Zeile weisen die gleiche Rangfolge auf.

Operatoren Kategorie oder Name
x.y, f(x), a[i], x?.y, x?[y], x++, x--, x!, new, typeof, checked, unchecked, default, nameof, delegate, sizeof, stackalloc, x->y Primär
+x, -x, !x, ~x, ++x, --x, ^x, (T)x, await, &x, *x, true und false Unär
x..y Bereich
switch, with switch- und with-Ausdrücke
x * y, x / y, x % y Multiplikativ
x + y, x – y Additiv
x << y, x >> y UMSCHALTTASTE
x < y, x > y, x <= y, x >= y, is, as Relational und Typtest
x == y, x != y Gleichheit
x & y Boolescher logischer AND-Operator oder bitweiser logischer AND-Operator
x ^ y Boolescher logischer XOR-Operator oder bitweiser logischer XOR-Operator
x | y Boolescher logischer OR-Operator oder bitweiser logischer OR-Operator
x && y Bedingtes AND
x || y Bedingtes OR
x ?? Y Nullzusammensetzungsoperator
c ? t : f Bedingter Operator
x = y, x += y, x -= y, x *= y, x /= y, x %= y, x &= y, x |= y, x ^= y, x <<= y, x >>= y, x ??= y, => Zuweisungs- und Lambdadeklaration

Operatorassoziativität

Wenn Operatoren die gleiche Rangfolge aufweisen, legt die Assoziativität der Operatoren die Reihenfolge fest, in der Vorgänge durchgeführt werden:

  • Linksassoziative Operatoren werden von links nach rechts ausgewertet. Mit Ausnahme der Zuweisungsoperatoren und des NULL-Sammeloperators sind alle binären Operatoren linksassoziativ. a + b - c wird beispielsweise als (a + b) - c ausgewertet.
  • Rechtsassoziative Operatoren werden von rechts nach links ausgewertet. Die Zuweisungsoperatoren, die NULL-Sammeloperatoren, Lambdas und der bedingte Operator ?: sind rechtsassoziativ. x = y = z wird beispielsweise als x = (y = z) ausgewertet.

Verwenden Sie Klammern, um die Reihenfolge der Auswertung zu ändern, die durch die Operatorassoziativität festgelegt ist:

int a = 13 / 5 / 2;
int b = 13 / (5 / 2);
Console.WriteLine($"a = {a}, b = {b}");  // output: a = 1, b = 6

Operandenauswertung

Unabhängig von der Operatorrangfolge und -assoziativität werden die Operanden in einem Ausdruck von links nach rechts ausgewertet. Die folgenden Beispiele veranschaulichen die Reihenfolge, in der Operatoren und Operanden ausgewertet werden:

expression Reihenfolge der Auswertung
a + b a, b, +
a + b * c a, b, c, *, +
a / b + c * d a, b, /, c, d, *, +
a / (b + c) * d a, b, c, +, /, d, *

In der Regel werden alle Operanden eines Operators ausgewertet. Einige Operatoren werten Operanden jedoch bedingt aus. Das heißt, der Wert des Operanden ganz links in einem solchen Operator definiert, ob (oder welche) andere(n) Operanden ausgewertet werden sollen. Diese Operatoren sind die bedingten logischen Operatoren AND (&&) und OR (||), die NULL-Sammeloperatoren ?? und ??=, die NULL-bedingten Operatoren ?. und ?[] sowie der bedingte Operator ?:. Weitere Informationen finden Sie in der Beschreibung jedes Operators.

C#-Sprachspezifikation

Weitere Informationen finden Sie in den folgenden Abschnitten der C#-Sprachspezifikation:

Siehe auch