C#-operátorok és -kifejezések (C#-referencia)
A C# számos operátort biztosít. Ezek közül számosat támogatnak a beépített típusok , és lehetővé teszik alapszintű műveletek végrehajtását az ilyen típusú értékekkel. Ezek az operátorok a következő csoportokat foglalják magukban:
- Numerikus operandusokkal aritmetikai műveleteket végrehajtó aritmetikai operátorok
- Numerikus operandusokat összehasonlító összehasonlító operátorok
- Logikai logikai operátorok, amelyek logikai műveleteket hajtanak végre operandusokkal
bool
- Bitenkénti és eltolási operátorok , amelyek bitenkénti vagy eltolási műveleteket hajtanak végre az egész típusok operandusaival
- Egyenlőségi operátorok , amelyek ellenőrzik, hogy operandusaik egyenlőek-e vagy sem
Ezek az operátorok általában túlterhelhetők , azaz megadhatja a felhasználó által definiált típusú operandusok operátori viselkedését.
A legegyszerűbb C#-kifejezések a literálok (például egész számok és valós számok) és a változók nevei. Operátorok használatával összetett kifejezésekké kombinálhatja őket. Az operátorok elsőbbségi sorrendje és az asszociativitás határozza meg, hogy a kifejezések műveletei milyen sorrendben legyenek végrehajtva. Zárójelek használatával módosíthatja az operátori elsőbbség és az asszociativitás által meghatározott kiértékelési sorrendet.
Az alábbi kódban a hozzárendelések jobb oldalán vannak példák a kifejezésekre:
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);
A kifejezések általában eredményt adnak, és egy másik kifejezésben is szerepelhetnek. A void
metódushívás egy olyan kifejezés példája, amely nem hoz létre eredményt. Csak utasításként használható, ahogy az alábbi példában látható:
Console.WriteLine("Hello, world!");
Íme néhány más kifejezés, amelyet a C# biztosít:
Interpolált sztringkifejezések , amelyek kényelmes szintaxist biztosítanak a formázott sztringek létrehozásához:
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-kifejezések , amelyek lehetővé teszik névtelen függvények létrehozását:
int[] numbers = { 2, 3, 4, 5 }; var maximumSquare = numbers.Max(x => x * x); Console.WriteLine(maximumSquare); // Output: // 25
Lekérdezési kifejezések , amelyek lehetővé teszik a lekérdezési képességek közvetlen használatát a C#-ban:
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
A kifejezéstörzs-definícióval tömör definíciót adhat meg egy metódushoz, konstruktorhoz, tulajdonsághoz, indexelőhöz vagy véglegesítőhöz.
Operátorok műveleti sorrendje
A több operátort tartalmazó kifejezésekben a magasabb elsőbbségű operátorokat a rendszer az alacsonyabb elsőbbségű operátorok előtt értékeli ki. A következő példában először a szorzást hajtjuk végre, mert nagyobb az elsőbbségi sorrendje, mint az összeadásnak:
var a = 2 + 2 * 2;
Console.WriteLine(a); // output: 6
Zárójelek használatával módosíthatja az operátorok elsőbbségi sorrendjét:
var a = (2 + 2) * 2;
Console.WriteLine(a); // output: 8
Az alábbi táblázat a C#-operátorokat sorolja fel, amelyek a legmagasabb prioritással kezdődnek a legalacsonyabbra. Az egyes sorokban lévő operátorok azonos elsőbbségi sorrendben vannak.
Operátorok | Kategória vagy név |
---|---|
x.y, f(x), a[i], x?.y , , x?[y] x++, x-, x!, new, typeof, checked, unchecked, default, nameof, delegate, sizeof, stackalloc, x-y> |
Elsődleges |
+x, -x, !x, ~x, ++x, --x, ^x, (T)x, await, &x, *x, true és false | Unáris |
x..y | Tartomány |
kapcsolót, a | switch és with kifejezések |
x * y, x / y, x % y | Multiplikatív |
x + y, x – y | Additív |
x << y, x >> y | Shift |
x < y, x > y, x <= y, x >= y, is, as | Relációs és típustesztelés |
x == y, x != y | Egyenlőség |
x & y |
Logikai ÉS vagy bitenkénti logikai ÉS |
x ^ y |
Logikai XOR vagy bitenkénti logikai XOR |
x | y |
Logikai VAGYbitenkénti logikai VAGY |
x && y | Feltételes ÉS |
x || Y | Feltételes VAGY |
X?? é | Null értékű ékesítési operátor |
C? t : f | Feltételes operátor |
x = y, x += y, x -= y, x *= y, x /= y, x %= y, x &= y, x |= y, x ^= y, x <<= y, x >>= y, x ? = y, => | Hozzárendelés és lambda deklaráció |
Operátor-asszociativitás
Ha az operátorok elsőbbsége megegyeznek, az operátorok asszociativitása határozza meg a műveletek végrehajtásának sorrendjét:
- A bal asszociatív operátorok kiértékelése balról jobbra haladva történik. A hozzárendelési operátorok és a null-halmazoló operátorok kivételével minden bináris operátor bal asszociatív. A kiértékelése
(a + b) - c
példáula + b - c
így történik: . - A jobb asszociatív operátorok kiértékelése jobbról balra haladva történik. A hozzárendelési operátorok, a null-halmazoló operátorok, a lambdas és a feltételes operátorok
?:
jobb asszociatívak. A kiértékelésex = (y = z)
példáulx = y = z
így történik: .
Zárójelek használatával módosíthatja az operátor-asszociativitás által meghatározott kiértékelési sorrendet:
int a = 13 / 5 / 2;
int b = 13 / (5 / 2);
Console.WriteLine($"a = {a}, b = {b}"); // output: a = 1, b = 6
Operandus értékelése
Az operátori elsőbbségtől és az asszociativitástól függetlenül a kifejezés operandusait balról jobbra értékeli a rendszer. Az alábbi példák bemutatják az operátorok és operandusok kiértékelésének sorrendjét:
Expression | Kiértékelési sorrend |
---|---|
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, * |
Általában minden operátor operandusát kiértékeli a rendszer. Egyes operátorok azonban feltételesen értékelik ki az operandusokat. Ez azt jelzi, hogy az ilyen operátor bal szélső operandusának értéke határozza meg, hogy más operandusokat kell-e (vagy melyiket) értékelni. Ezek az operátorok a feltételes logikai ÉS (&&
) és OR (||
) operátorok, a null-ékozó operátorok ??
és ??=
a null feltételes operátorok ?.
és ?[]
a feltételes operátorok ?:
. További információkért tekintse meg az egyes operátorok leírását.
C#-nyelv specifikációja
További információkért tekintse meg a C#-nyelv specifikációjának következő szakaszait: