Freigeben über


C#-Operatoren und -Ausdrücke

C# stellt eine Reihe von Operatoren bereit. Viele davon werden von den integrierten Typen unterstützt und ermöglichen es Ihnen, grundlegende Vorgänge mit Werten dieser Typen auszuführen. Zu diesen Operatoren gehören die folgenden Gruppen:

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

Die einfachsten C#-Ausdrücke sind Literale (z. B. ganze Zahl und reelle Zahlen) und Namen von Variablen. Sie können sie mithilfe von Operatoren in komplexe Ausdrücke kombinieren. Die Rangfolge und Zuordnung des Operators bestimmen die Reihenfolge, in der die Vorgänge in einem Ausdruck ausgeführt werden. Sie können Klammern verwenden, um die Reihenfolge der Auswertung zu ändern, die von der Rangfolge und der Zuordnung des Operators auferlegt wird.

Im folgenden Code befinden sich Beispiele für Ausdrücke auf der rechten Seite von Zuordnungen:

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];

List<int> numbers = [..collection];
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 für einen Ausdruck, der kein Ergebnis erzeugt. Sie kann nur als Anweisung verwendet werden, wie das folgende Beispiel zeigt:

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

Hier sind einige andere Arten von Ausdrücken, die C# bereitstellt:

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

    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.
    
  • Lambda-Ausdrü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:

    int[] scores = { 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 Ausdruckstextdefinition verwenden, um eine präzise Definition für eine Methode, einen Konstruktor, eine Eigenschaft, einen Indexer oder einen Finalizer bereitzustellen.

Rangfolge der Operatoren

In einem Ausdruck mit mehreren Operatoren werden die Operatoren mit höherer Rangfolge ausgewertet, bevor die Operatoren mit niedrigerer Rangfolge ausgewertet werden. Im folgenden Beispiel wird die Multiplikation zuerst ausgeführt, da sie eine höhere Priorität hat als addition:

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

Verwenden Sie Klammern, um die Reihenfolge der Bewertung zu ändern, die von der Rangfolge des Operators auferlegt wird:

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

In der folgenden Tabelle sind die C#-Operatoren aufgeführt, die mit der höchsten Rangfolge am niedrigsten beginnen. Die Operatoren in jeder Zeile haben dieselbe Priorität.

Betriebspersonal 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
umschalten, mit switch- und with-Ausdrücke
x * y, x / y, x % y Multiplikativ
x + y, x – y Additiv
x << y, x >> y, x >>> y Shift
x < y, x > y, x <= y, x >= y, ist, wie Relational und Typtest
x == y, x != y Gleichheit
x & y Boolescher logischer UND oder bitweiser logischeR UND
x ^ y Boolescher logischer XOR oder bitweiser logischer XOR
x | y Boolescher logischer ODERoder bitweiser logischer OR
x und y Bedingtes AND
x || y Bedingtes OR
x ?? y Null-Koalescingoperator
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, x >>>= y, x ?? = y, => Zuweisungs- und Lambda-Deklaration

Informationen zur Rangfolge logischer Musterkombinatoren finden Sie im Abschnitt "Rangfolge und Reihenfolge der Überprüfung der logischen Muster " des Artikels "Patterns ".

Operatorassoziivität

Wenn Operatoren die gleiche Priorität haben, bestimmt die Assoziivität der Operatoren die Reihenfolge, in der die Vorgänge ausgeführt werden:

  • Links-assoziative Operatoren werden von links nach rechts ausgewertet. Mit Ausnahme der Zuordnungsoperatoren und der Operatoren für die Null-Koppierung sind alle binären Operatoren linksassoziativ. Wird z. B a + b - c . als (a + b) - causgewertet.
  • Rechtsassoziative Operatoren werden von rechts nach links ausgewertet. Die Zuordnungsoperatoren, die Null-Koalierungsoperatoren, Lambdas und der bedingte Operator ?: sind rechtsassoziativ. Wird z. B x = y = z . als x = (y = z)ausgewertet.

Von Bedeutung

In einem Ausdruck des Formulars P?.A0?.A1, wenn P ja , weder nullA0 ausgewertet noch A1 ausgewertet werden. Ebenso wird in einem Ausdruck des Formulars P?.A0.A1, da A0 der Wert nicht ausgewertet wird, wenn P null ist, ebenso wenig A0.A1. Weitere Details finden Sie in der C#-Sprachspezifikation .

Verwenden Sie Klammern, um die Reihenfolge der Bewertung zu ändern, die von der Operatorassoziivität auferlegt wird:

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

Operandenauswertung

Nicht im Zusammenhang mit der Rangfolge und Assoziivität des Operators werden Operanden in einem Ausdruck von links nach rechts ausgewertet. Die folgenden Beispiele veranschaulichen die Reihenfolge, in der Operatoren und Operanden ausgewertet werden:

Ausdruck 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 Operatoropernden ausgewertet. Einige Operatoren bewerten operanden jedoch bedingt. Das heißt, der Wert des äußerst linken Operanden eines solchen Operators definiert, ob (oder welche) andere Operanden ausgewertet werden sollen. Diese Operatoren sind die operatoren bedingte logische UND () und OR (&&||) und die Operatoren null-koalierende Operatoren ?? und ??=, die null-bedingten Operatoren ?. und ?[]der bedingte Operator ?:. Weitere Informationen finden Sie in der Beschreibung der einzelnen Operatoren.

C#-Sprachspezifikation

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

Siehe auch