De forma predeterminada (en C#), pasar un objeto a una función en realidad pasa una copia de la referencia a ese objeto. Cambiar el parámetro en sí solo cambia el valor en el parámetro, y no la variable que se especificó.
void Test1(string param)
{
param = "new value";
}
string s1 = "initial value";
Test1(s1);
// s1 == "initial value"
Usando out
o ref
pasa una referencia a la variable especificada en la llamada a la función. Cualquier cambio en el valor de un parámetro out
o ref
se transmitirá a la persona que llama.
Tanto out
y ref
se comportan de forma idéntica excepto por una ligera diferencia: Es necesario ref
parámetros a ser inicializado antes de llamar, mientras out
parámetros pueden ser inicializadas. Por extensión, se garantiza que los parámetros ref
se inicialicen al comienzo del método, mientras que los parámetros out
se tratan como no inicializados.
void Test2(ref string param)
{
param = "new value";
}
void Test3(out string param)
{
// Use of param here will not compile
param = "another value";
}
string s2 = "initial value";
string s3;
Test2(ref s2);
// s2 == "new value"
// Test2(ref s3); // Passing ref s3 will not compile
Test3(out s2);
// s2 == "another value"
Test3(out s3);
// s3 == "another value"
Editar: Como dp puntos cabo, la diferencia entre out
y ref
sólo es ejecutada por el compilador de C#, no por el CLR. Hasta donde yo sé, VB no tiene equivalente para out
e implementa ref
(como ByRef
) solamente, haciendo coincidir el soporte del CLR.
"copia de la referencia a ese objeto" o "referencia a la copia de ese objeto"? – bjan