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:

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) - cpéldául a + 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ése x = (y = z)például x = 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:

Lásd még