Compartir a través de


Operadores de asignación (referencia de C#)

El operador de asignación = asigna el valor de su operando de la derecha a una variable, una propiedad o un elemento de indexador que proporciona el operando de la izquierda. El resultado de una expresión de asignación es el valor asignado al operando izquierdo. El tipo del operando de la derecha debe ser el mismo que el del operando de la izquierda o debe poder convertirse implícitamente en él.

El operador de asignación = es asociativo a la derecha, es decir, una expresión con el formato

a = b = c

Se evalúa como

a = (b = c)

En el ejemplo siguiente se muestra el uso del operador de asignación con una variable local, una propiedad y un elemento indexador como su operando izquierdo:

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

El operando de la izquierda de una asignación recibe el valor del operando de la derecha. Cuando los operandos son de tipos de valor, la asignación copia el contenido del operando de la derecha. Cuando los operandos son de tipos de referencia, la asignación copia la referencia al objeto.

Esta operación se denomina asignación de valores: se asigna el valor.

A partir de C# 14, el lado izquierdo de una asignación de valor puede incluir una expresión de miembro condicional null, como ?. o ?[]. Si el lado izquierdo es NULL, no se evalúa la expresión del lado derecho.

asignación de referencia

Asignación de referencia= ref hace que su operando izquierdo sea un alias del operando derecho, como muestra el siguiente ejemplo:

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

En el ejemplo anterior, la variable de referencia local arrayElement se inicializa como un alias del primer elemento de la matriz. A continuación, se reasigna ref para referir al último elemento de la matriz. Como es un alias, al actualizar su valor con un operador = de asignación normal, también se actualiza el elemento de la matriz correspondiente.

El operando izquierdo de la asignación ref puede ser una variable de referencia local, un campo ref y un parámetro de método ref, out o in. Los operandos deben ser del mismo tipo.

Una asignación de ref significa que una variable de referencia tiene una referencia diferente. Ya no hace referencia a su referente anterior. El uso de ref = en un parámetro ref significa que el parámetro ya no hace referencia a su argumento. Cualquier acción que modifique el estado del objeto después de reasignarlo hace que esas modificaciones se apliquen al nuevo elemento. Por ejemplo, considere el método siguiente:

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

El siguiente uso muestra que la asignación al parámetro s no es visible después de la llamada al método porque s se ref reasignó para hacer referencia a sLocal antes de que se modificara la cadena.

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

Asignación compuesta

Para un operador binario op, una expresión de asignación compuesta de la forma

x op= y

Es equivalente a

x = x op y

Excepto que x solo se evalúa una vez.

Los operadores aritméticos, lógicos booleanos y lógicos y de desplazamiento bit a bit admiten la asignación compuesta.

Asignación de uso combinado de NULL

Puede usar el operador de asignación de uso combinado de NULL ??= para asignar el valor de su operando de la derecha al operando de la izquierda solo si el operando de la izquierda se evalúa como null. Para obtener más información, consulte el artículo Operadores ?? y ??=.

Posibilidad de sobrecarga del operador

Un tipo definido por el usuario no puede sobrecargar el operador de asignación. Sin embargo, un tipo definido por el usuario puede definir una conversión implícita a otro tipo. De este modo, el valor de un tipo definido por el usuario puede asignarse a una variable, una propiedad o un elemento de indizador de otro tipo. Para obtener más información, vea Operadores de conversión definidos por el usuario.

Si un tipo definido por el usuario sobrecarga un operador opbinario , el op= operador, si existe, también se sobrecarga implícitamente. A partir de C# 14, un tipo definido por el usuario puede sobrecargar explícitamente los operadores de asignación compuesta (op=) para proporcionar una implementación más eficaz. Normalmente, un tipo sobrecarga estos operadores porque el valor se puede actualizar en su lugar, en lugar de asignar una nueva instancia para contener el resultado de la operación binaria. Si un tipo no proporciona una sobrecarga explícita, el compilador genera la sobrecarga implícita.

especificación del lenguaje C#

Para obtener más información, consulte la sección Operadores de asignación de la especificación del lenguaje C# y la especificación de características de asignación compuesta definida por el usuario .

Consulte también