pasar una ref
si desea cambiar lo que el objeto es:
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 HacerAlgo, t
no se refiere a la 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, p. Ej. a string
. No puede cambiar el valor de string
una vez que se haya creado. Pero al usar un ref
, puede crear una función que cambie la cadena por otra que tenga un valor diferente.
Editar: Como otras personas han mencionado. No es una buena idea usar ref
a menos que sea necesario. El uso de ref
le da libertad al método para cambiar el argumento por otra cosa, los llamadores del método necesitarán ser codificados para asegurar que manejen esta posibilidad.
Además, cuando el tipo de parámetro es un objeto, las variables de objeto siempre actúan como referencias al objeto. Esto significa que cuando se usa la palabra clave ref
, 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 (por ejemplo int
), entonces si este parámetro se asigna a dentro del método, el valor del argumento de que fue aprobada en será cambiado después devuelve el método:
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;
}
Si está pasando un valor de referencia o de tipo de valor, el comportamiento predeterminado es pasar por valor. Solo necesita comprender que con los tipos de referencia, el valor que está pasando * es * una referencia. Esto no es lo mismo que pasar * por * referencia. –