Share via


C#-operators en -expressies (C#-verwijzing)

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

var numbers = new List<int>(new[] { 1, 2, 3 });
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:

    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
    

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

Bewerkingsvolgorde van operators

In een expressie met meerdere operatoren 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 de evaluatie te wijzigen die wordt opgelegd door de prioriteit van de operator:

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

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

Operators Categorie of naam
x.y, f(x), a[i], x?.y, x?[y]x++, x-, x!, nieuw, typeof, ingeschakeld, uitgeschakeld, standaard, naamof, gemachtigde, grootteof, stackalloc, x-y> Primair
+x, -x, !x, ~x, ++x, --x, ^x, (T)x, wacht, &x, *x, waar en onwaar Unair
x..y Bereik
schakelen, met switch en with expressies
x * y, x / y, x % y Multiplicatief
x + y, x – y Additief
x << y, x >> y SHIFT
x < y, x > y, x <= y, x >= y, is, zoals Relationele en typetests
x == y, x != y Gelijkheid
x & y Booleaanse logische EN of bitwise logische AND
x ^ y Booleaanse logische XOR of bitwise logische XOR
x | y Booleaanse logische OR of bitwise logische OR
x && y Voorwaardelijk EN
x || Y 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, => Toewijzings- en lambda-verklaring

Koppelingsvermogen 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 operators 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).

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

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:

Expression 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 () en OR (&&||), de operatoren ?? voor null-coalescing en ??=, de null-voorwaardelijke operators ?. 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