referencia por pasar pasaje parametros objetos metodos funciones entre diferencia como clases c#

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



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.