Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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:
- Operatori aritmetici che eseguono operazioni aritmetiche con operandi numerici
- Operatori di confronto che confrontano gli operandi numerici
-
Operatori logici booleani che eseguono operazioni logiche con
bool
operandi - Operatori bit per bit e shift che eseguono operazioni bit per bit o di spostamento con operandi dei tipi integrali
- Operatori di uguaglianza che controllano se gli operandi sono uguali o meno
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 comex = (y = z)
.
Importante
In un'espressione del formato P?.A0?.A1
, se P
è null
, né A0
A1
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#: