Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 op
binario , 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 .