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.
asignación de referencia
Asignación de referencia= ref
convierte su operando izquierdo en un alias en el operando derecho, como se muestra en el ejemplo siguiente:
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 con el formato
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 desplazamiento y lógicos bit a bit admiten la asignación de recuento.
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 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.
Un tipo definido por el usuario no puede sobrecargar de forma explícita un operador de asignación compuesta. Pero si un tipo definido por el usuario sobrecarga un operador binario op
, el operador op=
, si existe, también se sobrecarga de forma implícita.
especificación del lenguaje C#
Para más información, consulte la sección sobre operadores de asignación de la Especificación del lenguaje C#.