por - pasar objetos como parametros en c#
¿Cuál es la diferencia entre ref y out?(C#) (6)
Del artículo de MSDN que Alex menciona,
El llamante de un método que toma un parámetro de salida no es necesario para asignar a la variable pasada como el parámetro de salida antes de la llamada; sin embargo, se requiere que el destinatario se asigne al parámetro out antes de regresar.
En contraste, los parámetros ref se consideran asignados inicialmente por el destinatario. Como tal, no es necesario que el destinatario se asigne al parámetro ref antes de su uso.
Por lo tanto, para resumir, dentro del método puede considerar los parámetros ref que se configurarán, pero no los parámetros; debe configurarlos. Fuera del método, deberían actuar de la misma manera.
¿Alguna explicación sucinta?
También se responde en: Diferencia entre los parámetros de ref y out en .NET
La manera más sucinta de verlo:
ref = inout
out = out
Los modos de paso de parámetros de ref y out se utilizan para permitir que un método altere las variables transmitidas por la persona que llama. La diferencia entre ref y out es sutil pero importante. Cada modo de paso de parámetros está diseñado para aplicarse a un escenario de programación ligeramente diferente. La diferencia importante entre los parámetros out y ref son las reglas de asignación definidas utilizadas por cada uno.
El llamante de un método que toma un parámetro de salida no es necesario para asignar a la variable pasada como el parámetro de salida antes de la llamada; sin embargo, se requiere que el destinatario se asigne al parámetro out antes de regresar.
fuente: MSDN
Mira este artículo de Jon Skeet sobre params en c #:
Para quien llama:
- Para un parámetro ref, la variable debe asignarse definitivamente ya
- Para un parámetro de salida, la variable no tiene que estar definitivamente asignada, pero será después de que el método retorne
Por el método:
- Un parámetro ref comienza definitivamente asignado, y no tiene que asignarle ningún valor
- Un parámetro de salida no empieza definitivamente asignado, y debe asegurarse de que en cualquier momento que regrese (sin excepción) se le asignará definitivamente
Asi que:
int x;
Foo(ref x); // Invalid: x isn''t definitely assigned
Bar(out x); // Valid even though x isn''t definitely assigned
Console.WriteLine(x); // Valid - x is now definitely assigned
...
public void Foo(ref int y)
{
Console.WriteLine(y); // Valid
// No need to assign value to y
}
public void Bar(out int y)
{
Console.WriteLine(y); // Invalid: y isn''t definitely assigned
if (someCondition)
{
// Invalid - must assign value to y before returning
return;
}
else if (someOtherCondition)
{
// Valid - don''t need to assign value to y if we''re throwing
throw new Exception();
}
else
{
y = 10;
// Valid - we can return once we''ve definitely assigned to y
return;
}
}
Vea este artículo en MSDN. Ambos logran cosas sutilmente diferentes, realmente.