Compartilhar via


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.

Essa operação é chamada atribuição de valor: o valor é atribuído.

atribuição de referência

A atribuição de referência= ref torna seu operando esquerdo um alias para o operando direito, como demonstra o 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.

Uma atribuição ref significa que uma variável de referência tem um referenciador diferente. Ele não está mais se referindo ao seu referenciador anterior. Usar ref = em um parâmetro ref significa que o parâmetro não se refere mais ao argumento. Todas as ações que modificam o estado do objeto após a reatribuição do ref fazem essas modificações no novo item. Por exemplo, considere o seguinte método:

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

O uso a seguir mostra que a atribuição ao parâmetro s não está visível após a chamada de método porque s foi ref reatribuída para se referir a sLocal antes da modificação da cadeia de caracteres:

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

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 só é avaliado uma vez.

Os operadores aritmético, lógico booliano e bit a bit lógico e shift suportam atribuição composta.

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