Delen via


C#-operators en -expressies

C# biedt een aantal operators. Veel van deze typen worden ondersteund door de ingebouwde typen en bieden u de mogelijkheid om basisbewerkingen uit te voeren met waarden van deze typen. Deze operators omvatten de volgende groepen:

Normaal gesproken kunt u deze operators overbelasten , dat wil gezegd, het gedrag van de operator opgeven voor de operanden van een door de gebruiker gedefinieerd type.

De eenvoudigste C#-expressies zijn letterlijke waarden (bijvoorbeeld gehele getallen en reële getallen) en namen van variabelen. U kunt deze combineren in complexe expressies met behulp van operators. Operatorprioriteit en associativiteit bepalen de volgorde waarin de bewerkingen in een expressie worden uitgevoerd. U kunt haakjes gebruiken om de volgorde van de evaluatie te wijzigen die wordt opgelegd door de prioriteit van de operator en de associativiteit.

In de volgende code staan voorbeelden van expressies aan de rechterkant van toewijzingen:

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

Normaal gesproken produceert een expressie een resultaat en kan deze worden opgenomen in een andere expressie. Een void methodeaanroep is een voorbeeld van een expressie die geen resultaat oplevert. Deze kan alleen als instructie worden gebruikt, zoals in het volgende voorbeeld wordt weergegeven:

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

Hier volgen enkele andere soorten expressies die C# biedt:

  • Geïnterpoleerde tekenreeksexpressies die handige syntaxis bieden voor het maken van opgemaakte tekenreeksen:

    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-expressies waarmee u anonieme functies kunt maken:

    int[] numbers = { 2, 3, 4, 5 };
    var maximumSquare = numbers.Max(x => x * x);
    Console.WriteLine(maximumSquare);
    // Output:
    // 25
    
  • Query-expressies waarmee u querymogelijkheden rechtstreeks in C# kunt gebruiken:

    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
    

U kunt een definitie van de expressietekst gebruiken om een beknopte definitie te bieden voor een methode, constructor, eigenschap, indexeerfunctie of finalizer.

Operatorprioriteit

In een expressie met meerdere operators worden de operators met een hogere prioriteit geëvalueerd voordat de operators een lagere prioriteit hebben. In het volgende voorbeeld wordt de vermenigvuldiging eerst uitgevoerd omdat deze een hogere prioriteit heeft dan optellen:

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

Gebruik haakjes om de volgorde van evaluatie te wijzigen die wordt opgelegd door operatorprioriteit:

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

De volgende tabel bevat de C#-operators die beginnen met de hoogste prioriteit tot de laagste. De operators binnen elke rij hebben dezelfde prioriteit.

Bedieners Categorie of naam
x.y, f(x), a[i], x?.y, x?[y]x++, x--, x!, nieuw, typeof, uitgeschakeld, standaard, naamof, gemachtigde, groottevan, stackalloc, x-y> Primair
+x, -x, !x, ~x, ++x, --x, ^x, (T)x, await, &x, *x, true en false Unaire
x..y Bereik
schakelaar, met expressies voor switch en with
x * y, x / y, x % y Multiplicatieve
x + y, x – y Toevoeging
x << y, x >> y, x >>> y Verschuiving
x < y, x > y, x <= y, x >= y, is, zoals Relationele en type-testen
x == y, x != y Gelijkheid
x & y Booleaanse logische AND of bitwise logische AND
x ^ y Booleaanse logische XOR of bitwise logische XOR
x | y Booleaanse logische OR of bitwise logische OR
x en y Voorwaardelijk en
x || j Voorwaardelijk OF
x ?? y Operator null-coalescing
c ? t : f Voorwaardelijke 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, => Toewijzings- en lambda-aangifte

Zie de sectie Prioriteit en volgorde van het controleren van logische patronen in het artikel Patronen voor informatie over de prioriteit van logische patrooncombinaties.

Associativiteit van operator

Wanneer operators dezelfde prioriteit hebben, bepaalt de associativiteit van de operators de volgorde waarin de bewerkingen worden uitgevoerd:

  • Links-associatieve operatoren worden geëvalueerd in volgorde van links naar rechts. Met uitzondering van de toewijzingsoperatoren en de operatoren voor null-coalescing zijn alle binaire operatoren links-associatief. Wordt bijvoorbeeld a + b - c geëvalueerd als (a + b) - c.
  • Rechts-associatieve operatoren worden geëvalueerd in volgorde van rechts naar links. De toewijzingsoperatoren, de operatoren voor null-coalescing, lambdas en de voorwaardelijke operator ?: zijn juist associatief. Wordt bijvoorbeeld x = y = z geëvalueerd als x = (y = z).

Belangrijk

In een expressie van het formulier P?.A0?.A1, als P dat het is null, noch A0A1 worden geëvalueerd. Op dezelfde manier, in een expressie van het formulier P?.A0.A1, omdat A0 deze niet wordt geëvalueerd wanneer P null is, is geen van beide A0.A1. Zie de C#-taalspecificatie voor meer informatie.

Gebruik haakjes om de volgorde van evaluatie te wijzigen die is opgelegd door de associativiteit van de operator:

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

Operand-evaluatie

Niet-gerelateerd aan operatorprioriteit en associativiteit worden operanden in een expressie van links naar rechts geëvalueerd. In de volgende voorbeelden ziet u de volgorde waarin operators en operanden worden geëvalueerd:

Uitdrukking Volgorde van evaluatie
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, *

Normaal gesproken worden alle operatoroperanden geëvalueerd. Sommige operators evalueren echter operanden voorwaardelijk. Dat wil gezegd, de waarde van de meest linkse operand van een dergelijke operator bepaalt of (of welke) andere operanden moeten worden geëvalueerd. Deze operators zijn de operatoren voor voorwaardelijke logische EN () EN (&&) enOR (||), de operatoren ?? voor null-coalescing en ??=, de operator voor null-voorwaardelijke voorwaarden ?. en ?[], en de voorwaardelijke operator ?:. Zie de beschrijving van elke operator voor meer informatie.

C#-taalspecificatie

Zie de volgende secties van de C#-taalspecificatie voor meer informatie:

Zie ook