Operatori ed espressioni c# (riferimenti per C#)C# operators and expressions (C# reference)

C# fornisce diversi operatori.C# provides a number of operators. Molti di essi sono supportati dai tipi predefiniti e consentono di eseguire operazioni di base con i valori di tali tipi.Many of them are supported by the built-in types and allow you to perform basic operations with values of those types. Questi operatori includono i gruppi seguenti:Those operators include the following groups:

In genere, è possibile eseguire l' Overload di questi operatori, ovvero specificare il comportamento dell'operatore per gli operandi di un tipo definito dall'utente.Typically, you can overload those operators, that is, specify the operator behavior for the operands of a user-defined type.

Le espressioni C# più semplici sono valori letterali (ad esempio, numeri interi e reali ) e nomi di variabili.The simplest C# expressions are literals (for example, integer and real numbers) and names of variables. È possibile combinarli in espressioni complesse usando gli operatori.You can combine them into complex expressions by using operators. La precedenza e l' associatività degli operatori determinano l'ordine in cui vengono eseguite le operazioni in un'espressione.Operator precedence and associativity determine the order in which the operations in an expression are performed. È possibile usare le parentesi per cambiare l'ordine di valutazione imposto dalla precedenza e dall'associatività degli operatori.You can use parentheses to change the order of evaluation imposed by operator precedence and associativity.

Nel codice seguente, esempi di espressioni si trovano sul lato destro delle assegnazioni:In the following code, examples of expressions are at the right-hand side of assignments:

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

In genere, un'espressione produce un risultato e può essere inclusa in un'altra espressione.Typically, an expression produces a result and can be included in another expression. Una void chiamata al metodo è un esempio di espressione che non produce alcun risultato.A void method call is an example of an expression that doesn't produce a result. Può essere usato solo come istruzione, come illustrato nell'esempio seguente:It can be used only as a statement, as the following example shows:

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

Ecco alcuni altri tipi di espressioni disponibili in C#:Here are some other kinds of expressions that C# provides:

  • Espressioni stringa interpolate che forniscono una sintassi pratica per creare stringhe formattate:Interpolated string expressions that provide convenient syntax to create formatted strings:

    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:Lambda expressions that allow you to create anonymous functions:

    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#:Query expressions that allow you to use query capabilities directly in 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
    

È possibile usare una definizione di corpo dell'espressione per fornire una definizione concisa per un metodo, un costruttore, una proprietà, un indicizzatore o un finalizzatore.You can use an expression body definition to provide a concise definition for a method, constructor, property, indexer, or finalizer.

Precedenza tra gli operatoriOperator precedence

In un'espressione con più operatori, gli operatori con precedenza superiore vengono valutati prima degli operatori con precedenza più bassa.In an expression with multiple operators, the operators with higher precedence are evaluated before the operators with lower precedence. Nell'esempio seguente, la moltiplicazione viene eseguita per prima perché ha una precedenza più alta rispetto all'addizione:In the following example, the multiplication is performed first because it has higher precedence than addition:

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

Usare le parentesi per cambiare l'ordine di valutazione imposto dalla precedenza tra gli operatori:Use parentheses to change the order of evaluation imposed by operator precedence:

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

La tabella seguente elenca gli operatori C# in ordine decrescente di precedenza.The following table lists the C# operators starting with the highest precedence to the lowest. Gli operatori nella stessa riga hanno la stessa precedenza.The operators within each row have the same precedence.

OperatoriOperators Categoria o nomeCategory or name
x. y, f (x), a[i], x?.y , x?[y] , x + +, x--, x!, New, typeof, checked, dechecked, default, NameOf, delegate, sizeof, stackalloc, x->yx.y, f(x), a[i], x?.y, x?[y], x++, x--, x!, new, typeof, checked, unchecked, default, nameof, delegate, sizeof, stackalloc, x->y PrincipalePrimary
+ x, -x, ! x, ~ x, + + x, --x, ^ x, (T) x, await, &x, * x, true e false+x, -x, !x, ~x, ++x, --x, ^x, (T)x, await, &x, *x, true and false UnarioUnary
x.. yx..y RangeRange
switchswitch Espressione switchswitch expression
conwith Espressione withwith expression
x * y, x / y, x % yx * y, x / y, x % y MoltiplicazioneMultiplicative
x + y, x – yx + y, x – y AdditiveAdditive
x << y, x >> yx << y, x >> y MAIUSCShift
x < y, x > y, x <= y, x > = y, is, Asx < y, x > y, x <= y, x >= y, is, as Operatori relazionali e operatori di test del tipoRelational and type-testing
x = = y, x! = yx == y, x != y UguaglianzaEquality
x & y AND logico booleano o AND bit per bitBoolean logical AND or bitwise logical AND
x ^ y XOR logico booleano o XOR bit per bitBoolean logical XOR or bitwise logical XOR
x | y OR logico booleano o OR bit per bitBoolean logical OR or bitwise logical OR
x && yx && y AND condizionaleConditional AND
x || yx || y OR condizionaleConditional OR
x ?? yx ?? y Operatore null-coalescingNull-coalescing operator
c ? t : fc ? t : f Operatore condizionaleConditional 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, =>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 lambdaAssignment and lambda declaration

Associatività degli operatoriOperator associativity

Quando gli operatori hanno la stessa precedenza, l'associatività degli operatori determina l'ordine di esecuzione delle operazioni:When operators have the same precedence, associativity of the operators determines the order in which the operations are performed:

  • Gli operatori associativi a sinistra vengono valutati nell'ordine da sinistra a destra.Left-associative operators are evaluated in order from left to right. Ad eccezione degli operatori di assegnazione e degli operatori che uniscono valori null, tutti gli operatori binari sono associativi a sinistra.Except for the assignment operators and the null-coalescing operators, all binary operators are left-associative. L'espressione a + b - c viene ad esempio valutata come (a + b) - c.For example, a + b - c is evaluated as (a + b) - c.
  • Gli operatori associativi a destra vengono valutati nell'ordine da destra a sinistra.Right-associative operators are evaluated in order from right to left. Gli operatori di assegnazione, gli operatori che uniscono valori null e l' operatore ?: condizionale sono associativi a destra.The assignment operators, the null-coalescing operators, and the conditional operator ?: are right-associative. L'espressione x = y = z viene ad esempio valutata come x = (y = z).For example, x = y = z is evaluated as x = (y = z).

Usare le parentesi per cambiare l'ordine di valutazione imposto dall'associatività degli operatori:Use parentheses to change the order of evaluation imposed by operator associativity:

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

Valutazione dell'operandoOperand evaluation

Senza correlazione con la precedenza e l'associatività degli operatori, gli operandi in un'espressione vengono valutati da sinistra a destra.Unrelated to operator precedence and associativity, operands in an expression are evaluated from left to right. Gli esempi seguenti dimostrano l'ordine di valutazione degli operatori e degli operandi:The following examples demonstrate the order in which operators and operands are evaluated:

ExpressionExpression Ordine di valutazioneOrder of evaluation
a + b a, b, +a, b, +
a + b * c a, b, c, *, +a, b, c, *, +
a / b + c * d a, b, /, c, d, *, +a, b, /, c, d, *, +
a / (b + c) * d a, b, c, +, /, d, *a, b, c, +, /, d, *

In genere, vengono valutati tutti gli operandi dell'operatore.Typically, all operator operands are evaluated. Tuttavia, alcuni operatori valutano gli operandi in modo condizionale.However, some operators evaluate operands conditionally. Ovvero, il valore dell'operando più a sinistra di tale operatore definisce se (o quali) devono essere valutati altri operandi.That is, the value of the leftmost operand of such an operator defines if (or which) other operands should be evaluated. Questi operatori sono gli operatori logici and ( && ) e OR ( || ) condizionali, gli operatori con Unione null ?? e ??= , gli operatori condizionali null ?. e ?[] e l' operatore ?: condizionale .These operators are the conditional logical AND (&&) and OR (||) operators, the null-coalescing operators ?? and ??=, the null-conditional operators ?. and ?[], and the conditional operator ?:. Per ulteriori informazioni, vedere la descrizione di ogni operatore.For more information, see the description of each operator.

Specifiche del linguaggio C#C# language specification

Per altre informazioni, vedere le sezioni seguenti delle specifiche del linguaggio C#:For more information, see the following sections of the C# language specification:

Vedere ancheSee also