407 votos

Diferencia entre el árbitro y parámetros en .NET

¿Cuál es la diferencia entre ref y out los parámetros en. net? ¿Cuáles son las situaciones donde uno puede ser más útil que la otra? ¿Cuál sería un fragmento de código donde uno puede ser utilizado y otro no?

498voto

Khoth Puntos 7001

Son casi los mismos : la única diferencia es que una variable que se pasa como out de parámetro no necesita ser inicializada, y el método que utiliza la out parámetro tiene para configurarlo para algo.

int x;
Foo(out x); // OK

int y;
Foo(ref y); // Error

Ref parámetros para datos que pueden ser modificados, out parámetros son los datos que de una salida adicional para la función (por ejemplo, int.TryParse) que ya están utilizando el valor de retorno para algo.

131voto

Derek Park Puntos 25025

¿Por qué C# tienen tanto 'ref' y 'out'?

El autor de la llamada de un método que toma un parámetro de salida no está obligado a asignar a la variable que se pasa como parámetro de salida antes de la llamada; sin embargo, el destinatario está obligado a asignar al parámetro de salida antes de regresar.

En cambio ref parámetros se consideran inicialmente asignados por el destinatario. Como tal, el destinatario no está obligado a asignar para el parámetro de referencia antes de su uso. Ref parámetros se pasan en y fuera de un método.

Así, out significa que, mientras ref es por dentro y fuera.

Estos se corresponden estrechamente con el [out] y [in,out] parámetros de las interfaces COM, las ventajas de out parámetros objeto de que las personas que llaman no necesita pasar un pre-asignada el objeto en los casos donde no se necesita por el método al que se llama, así se evita que tanto el costo de la asignación, y cualquier costo que podría estar asociado con el cálculo de referencias (más probable con COM, pero no infrecuente en .NET).

83voto

Euro Micelli Puntos 12845

[ref] y [out], permiten el llamado método para modificar un parámetro. La diferencia entre ellos es lo que sucede antes de que usted haga la llamada.

  • [ref] significa que el parámetro tiene un valor en él antes de entrar en la función. La función llamada puede leer y / o cambiar el valor de cualquier tiempo. El parámetro que va, entonces sale

  • [out] significa que el parámetro no tiene ningún valor oficial, antes de entrar en la función. La función llamada debe inicializar. El parámetro sólo se va fuera

Esta es mi forma favorita de un vistazo: [ref] es pasar variables por referencia. [out] para declarar un secundario valor devuelto por la función. Es como si usted podría escribir esto:

// This is not C#
public (bool, string) GetWebThing(string name, [ref] Buffer paramBuffer);

// This is C#
public bool GetWebThing(string name, [ref] Buffer paramBuffer, [out] string actualUrl);

Aquí está una lista más detallada de los efectos de cada alternativa:

Antes de llamar al método:

[ref]: el autor de La llamada debe establecer el valor del parámetro antes de pasar a la llamada de método.

[out]: el autor de La llamada método no es necesario para establecer el valor del argumento antes de llamar al método. Lo más probable es que no. De hecho, cualquier valor actual se descarta.

Durante la llamada:

[ref]: El llamado método puede leer el argumento en cualquier momento.

[out]: El llamado método debe inicializar el parámetro antes de la lectura.

Remoto de llamadas:

[ref]: El valor actual se calcula a la llamada remota. Rendimiento Extra costo.

[out]: Nada se pasa a la llamada remota. Más rápido.

Técnicamente hablando, usted podría usar siempre [ref] en lugar de [out], pero [out] le permite ser más precisa sobre el significado de la discusión, y a veces puede ser mucho más eficiente.

4voto

Patrick Puntos 20392

Los parámetros Ref no están obligados a establecerse en la función, mientras que parámetros deben ser enlazado a un valor antes de salir de la función. Variables pasan como fuera también puede pasarse a una función sin ser inicializado.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X