Condividi tramite


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 = è associativo a destra, il che significa che un'espressione della forma

a = b = c

Viene valutato 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.

A partire da C# 14, il lato sinistro di un'assegnazione di valore può includere un'espressione membro condizionale Null, ad esempio ?. o ?[]. Se il lato sinistro è Null, l'espressione sul lato destro non viene valutata.

Assegnazione ref

L'assegnazione di riferimento= ref rende l'operando di sinistra un alias di quello 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.

Un'assegnazione ref indica che una variabile di riferimento ha un riferimento diverso. Non fa più riferimento al suo precedente referrent. L'uso di ref = su un ref parametro indica che il parametro non fa più riferimento al relativo argomento. Tutte le azioni che modificano lo stato dell'oggetto dopo la riassegnazione dell'oggetto apportano tali modifiche al nuovo elemento. Si consideri ad esempio il metodo seguente:

private static void RefReassignAndModify(scoped ref string s)
{
    string sLocal = "Hello";
    Console.WriteLine(sLocal);  // Output: Hello

    s = ref sLocal;
    s = "World";
    Console.WriteLine(s);  // Output: World

L'utilizzo seguente mostra che l'assegnazione al parametro s non è visibile dopo la chiamata al metodo perché s è stata ref riassegnata per fare riferimento a sLocal prima della modifica della stringa:

string msg = "Hi";
RefReassignAndModify(ref msg);
Console.WriteLine(msg); // Output: Hi!

Assegnazione composta

Per un operatore binario op, un'espressione di assegnazione composta nella forma

x op= y

Equivale a

x = x op y

Ad eccezione del fatto che x viene valutato una sola volta.

Gli operatori aritmetici, logici booleani e logici bit per bit e di spostamento supportano l'assegnazione composta.

Assegnazione nulla coalescente

È 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 ulteriori informazioni, vedere l'articolo sugli ?? operatori e ??=.

Sovraccaricabilità 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