Pase un ref
si desea cambiar el objeto:
TestRef t = new TestRef();
t.Something = "Foo";
DoSomething(ref t);
void DoSomething(ref TestRef t)
{
t = new TestRef();
t.Something = "Not just a changed t, but a completely different TestRef object";
}
Después de llamar a DoSomething, t
no se refiere al original new TestRef
, sino que se refiere a un objeto completamente diferente.
Esto también puede ser útil si desea cambiar el valor de un objeto inmutable, por ejemplo a string
. No puede cambiar el valor de una string
vez que se ha creado. Pero al usar a ref
, podría crear una función que cambie la cadena por otra que tenga un valor diferente.
Editar: como han mencionado otras personas. No es una buena idea usarlo a ref
menos que sea necesario. El uso ref
le da al método la libertad de cambiar el argumento de otra cosa, los llamadores del método deberán codificarse para garantizar que manejen esta posibilidad.
Además, cuando el tipo de parámetro es un objeto, las variables del objeto siempre actúan como referencias al objeto. Esto significa que cuando ref
se usa la palabra clave, tiene una referencia a una referencia. Esto le permite hacer las cosas como se describe en el ejemplo anterior. Pero, cuando el tipo de parámetro es un valor primitivo (p int
. Ej. ), Si este parámetro se asigna dentro del método, el valor del argumento que se pasó se cambiará después de que el método devuelva:
int x = 1;
Change(ref x);
Debug.Assert(x == 5);
WillNotChange(x);
Debug.Assert(x == 5); // Note: x doesn't become 10
void Change(ref int x)
{
x = 5;
}
void WillNotChange(int x)
{
x = 10;
}