Operatori di assegnazione (riferimenti per C#)

L'operatore di assegnazione = assegna il valore dell'operando di destra a una variabile, una proprietà o un elemento indicizzatore indicato dall'operando di sinistra. Il risultato di un'espressione di assegnazione è il valore assegnato all'operando a sinistra. Il tipo dell'operando destro deve corrispondere al tipo dell'operando sinistro o essere convertibile in modo implicito in esso.

L'operatore di assegnazione = si associa all'operando di destra, che significa che un'espressione nel formato

a = b = c

viene valutata come

a = (b = c)

L'esempio seguente illustra l'utilizzo dell'operatore di assegnazione con una variabile locale, una proprietà e un elemento indicizzatore come operando sul lato sinistro:

List<double> numbers = [1.0, 2.0, 3.0];

Console.WriteLine(numbers.Capacity);
numbers.Capacity = 100;
Console.WriteLine(numbers.Capacity);
// Output:
// 4
// 100

int newFirstElement;
double originalFirstElement = numbers[0];
newFirstElement = 5;
numbers[0] = newFirstElement;
Console.WriteLine(originalFirstElement);
Console.WriteLine(numbers[0]);
// Output:
// 1
// 5

L'operando di sinistra di un'assegnazione riceve il valore dell'operando di destra. Quando gli operandi sono di tipo valore, l'assegnazione copia il contenuto dell'operando di destra. Quando gli operandi sono di tipo riferimento, l'assegnazione copia il riferimento all'oggetto.

Questa operazione è denominata assegnazione di valore: il valore viene assegnato.

Assegnazione ref

L'assegnazione ref= ref rende l'operando di sinistra un alias dell'operando di destra, come illustrato nell'esempio seguente:

void Display(double[] s) => Console.WriteLine(string.Join(" ", s));

double[] arr = { 0.0, 0.0, 0.0 };
Display(arr);

ref double arrayElement = ref arr[0];
arrayElement = 3.0;
Display(arr);

arrayElement = ref arr[arr.Length - 1];
arrayElement = 5.0;
Display(arr);
// Output:
// 0 0 0
// 3 0 0
// 3 0 5

Nell'esempio precedente la variabile di riferimento localearrayElement viene inizializzata come alias del primo elemento della matrice. Viene quindi riassegnato il valore ref per fare riferimento all'ultimo elemento della matrice. Poiché si tratta di un alias, quando si aggiorna il relativo valore con un normale operatore di assegnazione =, viene aggiornato anche l'elemento della matrice corrispondente.

L'operando di sinistra dell'assegnazione ref può essere una variabile di riferimento locale, uncampo ref e un parametro del metodo ref, out o in. Entrambi gli operandi devono essere dello stesso tipo.

Assegnazione composta

Per un operatore binario op, un'espressione di assegnazione composta in formato

x op= y

equivale a

x = x op y

con la differenza che x viene valutato una sola volta.

L'assegnazione composta è supportata da operatori aritmetici, logici booleani e logici bit per bit e shift.

Assegnazione di coalescenza di valori Null

È possibile usare l'operatore di assegnazione di coalescenza di valori Null ??= per assegnare il valore dell'operando di destra al relativo operando di sinistra solo se l'operando di sinistra restituisce null. Per altre informazioni, vedere l'articolo Operatori ?? e ??=.

Overload degli operatori

Un tipo definito dall'utente non può eseguire l'overload dell'operatore di assegnazione. Tuttavia, un tipo definito dall'utente può definire una conversione implicita in un altro tipo. In questo modo il valore di un tipo definito dall'utente può essere assegnato a una variabile, una proprietà o un elemento indicizzatore di un altro tipo. Per altre informazioni, vedere Operatori di conversione definiti dall'utente.

Un tipo definito dall'utente non può eseguire in modo esplicito l'overload di un operatore di assegnazione composta. Tuttavia, se un tipo definito dall'utente esegue l'overload di un operatore binario op, viene eseguito l'overload implicito anche dell'operatore op=, se esiste.

Specifiche del linguaggio C#

Per altre informazioni, vedere la sezione Operatori di assegnazione della specifica del linguaggio C#.

Vedi anche