Condividi tramite


Operatori ed espressioni C#

C# fornisce diversi operatori. Molti di essi sono supportati dai tipi predefiniti e consentono di eseguire operazioni di base con valori di tali tipi. Tali operatori includono i gruppi seguenti:

In genere, è possibile eseguire l'overload di tali operatori, ovvero specificare il comportamento dell'operatore per gli operandi di un tipo definito dall'utente.

Le espressioni C# più semplici sono valori letterali (ad esempio numeri interi e reali ) e nomi di variabili. È possibile combinarli in espressioni complesse usando gli operatori . La precedenza e l'associatività degli operatori determinano l'ordine in cui vengono eseguite le operazioni in un'espressione. È possibile usare le parentesi per modificare l'ordine di valutazione imposto dalla precedenza e dall'associatività dell'operatore.

Nel codice seguente, esempi di espressioni si trovano sul lato destro delle assegnazioni:

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

In genere, un'espressione produce un risultato e può essere inclusa in un'altra espressione. Una void chiamata al metodo è un esempio di un'espressione che non produce un risultato. Può essere usato solo come istruzione , come illustrato nell'esempio seguente:

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

Ecco alcuni altri tipi di espressioni fornite da C#:

  • Espressioni di stringa interpolate che forniscono una sintassi pratica per creare stringhe formattate:

    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.
    
  • Espressioni lambda che consentono di creare funzioni anonime:

    int[] numbers = { 2, 3, 4, 5 };
    var maximumSquare = numbers.Max(x => x * x);
    Console.WriteLine(maximumSquare);
    // Output:
    // 25
    
  • Espressioni di query che consentono di usare le funzionalità di query direttamente in C#:

    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
    

È possibile usare una definizione del corpo dell'espressione per fornire una definizione concisa per un metodo, un costruttore, una proprietà, un indicizzatore o un finalizzatore.

Precedenza dell'operatore

In un'espressione con più operatori, gli operatori con precedenza più elevata vengono valutati prima degli operatori con precedenza inferiore. Nell'esempio seguente, la moltiplicazione viene eseguita per prima perché ha una precedenza maggiore rispetto all'aggiunta:

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

Usare le parentesi per modificare l'ordine di valutazione imposto dalla precedenza dell'operatore:

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

La tabella seguente elenca gli operatori C# che iniziano con la precedenza più alta rispetto al più basso. Gli operatori all'interno di ogni riga hanno la stessa precedenza.

Operatori Categoria o nome
x.y, f(x), a[i], x?.y, , x?[y]x++, x--, x!, new, typeof, checked, unchecked, default, nameof, delegate, sizeof, stackalloc, x-y> Primaria
+x, -x, !x, ~x, ++x, --x, ^x, (T)x, await, &x, *x, true e false Unario
x..y Intervallo
switch, con espressioni switch e with
x * y, x / y, x % y Moltiplicativo
x + y, x – y Additivo
x << y, x >> y, x >>> y Spostamento
x < y, x > y, x <= y, x >= y, is, as Test relazionali e di tipi
x == y, x != y Uguaglianza
x & y AND logico booleano o AND logico bit per bit
x ^ y XOR logico booleano o XOR logico bit per bit
x | y OR logico booleano o OR logico bit per bit
x e y E condizionale
x || e OR condizionale
x ?? y Operatore null-coalescing
c ? t : f Operatore condizionale
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, => Assegnazione e dichiarazione lambda

Per informazioni sulla precedenza dei combinatori di criteri logici, vedere la sezione Precedenza e ordine di controllo dei modelli logici dell'articolo Modelli .

Associatività degli operatori

Quando gli operatori hanno la stessa precedenza, l'associatività degli operatori determina l'ordine in cui vengono eseguite le operazioni:

  • Gli operatori associati a sinistra vengono valutati in ordine da sinistra a destra. Ad eccezione degli operatori di assegnazione e degli operatori null-coalescing, tutti gli operatori binari sono associati a sinistra. Ad esempio, a + b - c viene valutato come (a + b) - c.
  • Gli operatori associati a destra vengono valutati in ordine da destra a sinistra. Gli operatori di assegnazione, gli operatori null-coalescing, le espressioni lambda e l'operatore ?:condizionale sono associati a destra. Ad esempio, x = y = z viene valutato come x = (y = z).

Importante

In un'espressione del formato P?.A0?.A1, se P è null, né A0A1 né vengono valutati. Analogamente, in un'espressione del formato P?.A0.A1, perché A0 non viene valutata quando P è null, nessuno dei due è A0.A1. Per altri dettagli, vedere la specifica del linguaggio C# .

Usare le parentesi per modificare l'ordine di valutazione imposto dall'associatività degli operatori:

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

Valutazione dell'operando

Non correlato alla precedenza e all'associatività degli operatori, gli operandi in un'espressione vengono valutati da sinistra a destra. Gli esempi seguenti illustrano l'ordine in cui vengono valutati gli operatori e gli operandi:

Espressione Ordine di valutazione
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, *

In genere, tutti gli operandi dell'operatore vengono valutati. Tuttavia, alcuni operatori valutano gli operandi in modo condizionale. Ovvero, il valore dell'operando più a sinistra di tale operatore definisce se (o quali) altri operandi devono essere valutati. Questi operatori sono gli operatori AND logici condizionali () e OR (&&||), gli operatori ?? null-coalescing e ??=, gli operatori ?. condizionali Null e ?[]e l'operatore ?:condizionale . Per altre informazioni, vedere la descrizione di ogni operatore.

Specificazione del linguaggio C#

Per altre informazioni, vedere le sezioni seguenti delle specifiche del linguaggio C#:

Vedere anche