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:
- Aritmetiska operatorer som utför aritmetiska operationer med numeriska operander
- Jämförelseoperatorer som jämför numeriska operander
- Booleska logiska operatorer som utför logiska åtgärder med
bool
operander - Bitvisa operatorer och skiftoperatorer som utför bitvisa eller skiftåtgärder med operander av de integrerade typerna
- Likhetsoperatorer som kontrollerar om deras operander är lika med eller inte
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 exempelx = y = z
somx = (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: