Operadores de atribuição (referência C#)

O operador de atribuição = atribui o valor do operando do lado direito a uma variável, uma propriedade ou um elemento indexador fornecido pelo operando do lado esquerdo. O resultado de uma expressão de atribuição é o valor atribuído a um operando do lado esquerdo. O tipo do operandos do lado direito deve ser do mesmo tipo ou implicitamente conversível para o operando do lado esquerdo.

O operador de atribuição = é associativo direito, ou seja, uma expressão da forma

a = b = c

é avaliada como

a = (b = c)

O exemplo a seguir demonstra o uso do operador de atribuição com uma variável local, uma propriedade e um elemento do indexador como seu operando esquerdo:

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

O operando à esquerda de uma atribuição recebe o valor do operando à direita. Quando os operandos são de tipos de valor, a atribuição copia o conteúdo do operando à direita. Quando os operandos são de tipos de referência, a atribuição copia a referência ao objeto.

Isso é chamado de atribuição de valor: o valor é atribuído.

atribuição de referência

A atribuição de referência = ref torna seu operando da esquerda um alias para o operando à direita, conforme demonstrado no exemplo a seguir:

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

No exemplo anterior, a variável de referência localarrayElement é inicializada como um alias para o primeiro elemento da matriz. Em seguida, ref será reatribuído para se referir ao último elemento da matriz. Como é um alias, quando você atualiza seu valor com um operador = de atribuição comum, o elemento de matriz correspondente também é atualizado.

O operando esquerdo da atribuição ref pode ser uma variável de referência local , um ref campo e um parâmetro de método ref, out ou in. Ambos os operandos devem ter o mesmo tipo.

Atribuição composta

Para um operador binário op, uma expressão de atribuição composta do formato

x op= y

é equivalente a

x = x op y

exceto que x é avaliado apenas uma vez.

A atribuição composta é tem suporte dos operadores aritmético, lógico booliano e bit a bit lógico e shift.

Atribuição de avaliação de nulo

Você pode usar o operador de avaliação de nulo ??= para atribuir o valor do seu operando direito ao operando esquerdo somente se o operando esquerdo for avaliado como null. Para obter mais informações, confira o artigo Operadores ?? e ??=.

Capacidade de sobrecarga do operador

Um tipo definido pelo usuário não pode sobrecarregar o operador de atribuição. No entanto, um tipo definido pelo usuário pode definir uma conversão implícita em outro tipo. Dessa forma, o valor de um tipo definido pelo usuário pode ser atribuído a uma variável, uma propriedade ou um elemento do indexador de outro tipo. Para saber mais, confira Operadores de conversão definidos pelo usuário.

Um tipo definido pelo usuário não pode sobrecarregar explicitamente um operador de atribuição composta. No entanto, se um tipo definido pelo usuário sobrecarregar um operador binário op, o operador op=, se houver, também será implicitamente sobrecarregado.

Especificação da linguagem C#

Saiba mais na seção Operadores de atribuição na Especificação da linguagem C#.

Confira também