C#-operatorer och -uttryck (C#-referens)

C# innehåller ett antal operatorer. Många av dem stöds av de inbyggda typerna och gör att du kan utföra grundläggande åtgärder med värden för dessa typer. Dessa operatorer innehåller följande grupper:

Normalt kan du överbelasta dessa operatorer, d.v.s. ange operatorbeteendet för operanderna av en användardefinierad typ.

De enklaste C#-uttrycken är literaler (till exempel heltal och verkliga tal) och namn på variabler. Du kan kombinera dem i komplexa uttryck med hjälp av operatorer. Operatorprioritet och associativitet avgör i vilken ordning åtgärderna i ett uttryck utförs. Du kan använda parenteser för att ändra den utvärderingsordning som tillämpas av operatorprioritet och associativitet.

I följande kod finns exempel på uttryck till höger om tilldelningar:

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

Vanligtvis ger ett uttryck ett resultat och kan inkluderas i ett annat uttryck. Ett void metodanrop är ett exempel på ett uttryck som inte ger något resultat. Den kan endast användas som en -instruktion, som följande exempel visar:

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

Här följer några andra typer av uttryck som C# tillhandahåller:

  • Interpolerade stränguttryck som ger praktisk syntax för att skapa formaterade strängar:

    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-uttryck som gör att du kan skapa anonyma funktioner:

    int[] numbers = { 2, 3, 4, 5 };
    var maximumSquare = numbers.Max(x => x * x);
    Console.WriteLine(maximumSquare);
    // Output:
    // 25
    
  • Frågeuttryck som gör att du kan använda frågefunktioner direkt i C#:

    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
    

Du kan använda en uttryckstextdefinition för att ge en kortfattad definition för en metod, konstruktor, egenskap, indexerare eller slutförare.

Prioritet för operator

I ett uttryck med flera operatorer utvärderas operatorerna med högre prioritet före operatorerna med lägre prioritet. I följande exempel utförs multiplikationen först eftersom den har högre prioritet än addition:

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

Använd parenteser för att ändra den utvärderingsordning som tillämpas av operatorprioretens:

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

I följande tabell visas de C#-operatorer som börjar med den högsta prioriteten till den lägsta. Operatorerna på varje rad har samma prioritet.

Operatorer Kategori eller namn
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 och false Enställig
x..y Intervall
växel, med switch och with uttryck
x * y, x / y, x % y Multiplikativ
x + y, x – y Additiv
x << y, x >> y Skift
x < y, x > y, x <= y, x >= y, är, som Relations- och typtestning
x == y, x != y Likhet
x & y Booleskt logiskt AND eller bitvis logiskt AND
x ^ y Boolesk logisk XOR eller bitvis logisk XOR
x | y Boolesk logisk ELLER eller bitvis logisk OR
x && y Villkorsstyrd AND
x || Y Villkorsstyrd ELLER
X?? y Operatorn Null-coalescing
C? t : f Villkorsoperator
x = y, x += y, x -= y, x *= y, x /= y, x %= y, x &= y, x |= y, x ^= y, x <<= y, x >>= y, x ?? = y, => Tilldelnings- och lambdadeklaration

Operator associativity

När operatorerna har samma prioritet avgör operatorernas associativitet i vilken ordning åtgärderna utförs:

  • Vänster-associativa operatorer utvärderas i ordning från vänster till höger. Förutom tilldelningsoperatorerna och operatorerna null-coalescing är alla binära operatorer vänster-associativa. Utvärderas till exempel a + b - c som (a + b) - c.
  • Höger-associativa operatorer utvärderas i ordning från höger till vänster. Tilldelningsoperatorerna, operatorerna null-coalescing, lambdas och villkorsoperatorn ?: är höger-associativa. Utvärderas till exempel x = y = z som x = (y = z).

Använd parenteser för att ändra utvärderingsordningen för operatorns associativitet:

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

Operandutvärdering

Operander i ett uttryck är inte relaterade till operatorprioritet och associativitet och utvärderas från vänster till höger. Följande exempel visar i vilken ordning operatorer och operander utvärderas:

Uttryck Utvärderingsordning
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, *

Normalt utvärderas alla operatoroperands. Vissa operatorer utvärderar dock operander villkorligt. Det innebär att värdet för den vänstra operanden för en sådan operator definierar om (eller vilka) andra operander ska utvärderas. Dessa operatorer är de villkorsstyrda logiska OPERATORerna AND (&&) och OR (||),operatorerna ?? null-coalescing och ??=, operatorerna ?. null-conditional och ?[]och villkorsoperatorn ?:. Mer information finns i beskrivningen av varje operator.

C#-språkspecifikation

Mer information finns i följande avsnitt i C#-språkspecifikationen:

Se även