c# .net

c# - Diferencia entre los parámetros ref y out en.NET



(18)

Parámetros de referencia y salida:

Los parámetros out y ref se usan para devolver valores en la misma variable, que pasa como un argumento de un método. Estos dos parámetros son muy útiles cuando su método necesita devolver más de un valor.

Debe asignar un valor al parámetro out en el cuerpo del método calee, de lo contrario el método no se compilará.

Parámetro de referencia: debe inicializarse antes de pasar al Método. La palabra clave ref en un parámetro de método hace que un método se refiera a la misma variable que se pasó como parámetro de entrada para el mismo método. Si realiza algún cambio en la variable, se reflejarán en la variable.

int sampleData = 0; sampleMethod(ref sampleData);

Ex del parámetro de referencia

public static void Main() { int i = 3; // Variable need to be initialized sampleMethod(ref i ); } public static void sampleMethod(ref int sampleData) { sampleData++; }

Parámetro de salida: no es necesario inicializarlo antes de pasar al Método. El parámetro out se puede usar para devolver los valores en la misma variable pasada como un parámetro del método. Cualquier cambio realizado en el parámetro se reflejará en la variable.

int sampleData; sampleMethod(out sampleData);

Ex de parámetro de salida

public static void Main() { int i, j; // Variable need not be initialized sampleMethod(out i, out j); } public static int sampleMethod(out int sampleData1, out int sampleData2) { sampleData1 = 10; sampleData2 = 20; return 0; }

Esta pregunta ya tiene una respuesta aquí:

¿Cuál es la diferencia entre out parámetros ref y out en .NET? ¿Cuáles son las situaciones donde uno puede ser más útil que el otro? ¿Qué sería un fragmento de código donde se puede usar uno y otro no?


afuera:

En C #, un método puede devolver solo un valor. Si desea devolver más de un valor, puede usar la palabra clave out. El modificador out regresa como retorno por referencia. La respuesta más simple es que la palabra clave "out" se usa para obtener el valor del método.

  • No es necesario inicializar el valor en la función de llamada.
  • Debe asignar el valor en la función llamada, de lo contrario el compilador informará un error.

árbitro:

En C #, cuando pasa un tipo de valor como int, float, double, etc. como argumento al parámetro del método, se pasa por valor. Por lo tanto, si modifica el valor del parámetro, no afecta el argumento en la llamada al método. Pero si marca el parámetro con la palabra clave "ref", se reflejará en la variable real.

  • Debe inicializar la variable antes de llamar a la función.
  • No es obligatorio asignar ningún valor al parámetro ref en el método. Si no cambia el valor, ¿cuál es la necesidad de marcarlo como "ref"?

Cuando se declara un parámetro de salida en la declaración del método, el cuerpo del método debe asignar un valor a la variable de salida antes de regresar. Por lo tanto, es responsabilidad del método llamado asignar el valor al parámetro out antes de que regrese.

Cuando se declara un parámetro ref en el método, el argumento que se pasa al invocar el método debería haber asignado el valor. Por lo tanto, es responsabilidad del llamante asignar el valor para el argumento ref antes de llamar al método.


Ejemplo para OUT: la variable obtiene el valor inicializado después de entrar en el método. Posteriormente se devuelve el mismo valor al método principal.

namespace outreftry { class outref { static void Main(string[] args) { yyy a = new yyy(); ; // u can try giving int i=100 but is useless as that value is not passed into // the method. Only variable goes into the method and gets changed its // value and comes out. int i; a.abc(out i); System.Console.WriteLine(i); } } class yyy { public void abc(out int i) { i = 10; } } }

Salida:

10

================================================

Ejemplo de referencia: la variable debe inicializarse antes de entrar en el método. Posteriormente, el mismo valor o valor modificado se devolverá al método principal.

namespace outreftry { class outref { static void Main(string[] args) { yyy a = new yyy(); ; int i = 0; a.abc(ref i); System.Console.WriteLine(i); } } class yyy { public void abc(ref int i) { System.Console.WriteLine(i); i = 10; } } }

Salida:

0 10

=================================

Espero que esté claro ahora.


Este parámetro de salida y referencia en C # tiene algunos buenos ejemplos.

La diferencia básica es que no es necesario inicializar los parámetros cuando se pasan, mientras que los parámetros ref.


La palabra clave ref se utiliza para pasar valores por referencia. (Esto no impide que los valores pasados ​​sean tipos de valor o tipos de referencia). Los parámetros de salida especificados con la palabra clave out son para devolver valores de un método.

Una diferencia clave en el código es que debe establecer el valor de un parámetro de salida dentro del método. Este no es el caso de los parámetros de referencia.

Para más detalles, visite http://www.blackwasp.co.uk/CSharpMethodParameters.aspx


No se requiere que los parámetros de referencia se configuren en la función, mientras que los parámetros de salida deben estar vinculados a un valor antes de salir de la función. Las variables pasadas como fuera también pueden pasarse a una función sin inicializarse.


Son prácticamente iguales: la única diferencia es que una variable que se pasa como parámetro de out no necesita inicializarse, pero al pasarla como parámetro de ref , debe configurarse en algo.

int x; Foo(out x); // OK int y; Foo(ref y); // Error: y should be initialized before calling the method

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


Son sutilmente diferentes.

Un parámetro de out no necesita ser inicializado por el destinatario antes de pasarlo al método. Por lo tanto, cualquier método con un parámetro de out

  • No se puede leer el parámetro antes de asignarle un valor
  • Debe asignarle un valor antes de regresar.

Esto se utiliza para un método que necesita sobrescribir su argumento independientemente de su valor anterior.

Un parámetro de ref debe ser inicializado por el destinatario antes de pasarlo al método. Por lo tanto, cualquier método con un parámetro ref

  • Puede inspeccionar el valor antes de asignarlo.
  • Puede devolver el valor original, sin tocar.

Esto se utiliza para un método que debe (por ejemplo) inspeccionar su valor y validarlo o normalizarlo.


Un parámetro out es un parámetro ref con un atributo especial Out() agregado. Si un parámetro en un método C # se declara como out , el compilador requerirá que el parámetro se escriba antes de que pueda leerse y antes de que el método pueda regresar. Si C # llama a un método cuyo parámetro incluye un atributo Out() , el compilador, para los fines de decidir si notificar errores de "variable no definida", simulará que la variable se escribe inmediatamente antes de llamar al método. Tenga en cuenta que debido a que otros idiomas .net no asocian el mismo significado al atributo Out() , es posible que al llamar a una rutina con un parámetro out no se vea afectada la variable en cuestión. Si una variable se usa como un parámetro de out antes de que se asigne definitivamente, el compilador de C # generará un código para asegurarse de que se borra en algún momento antes de que se use, pero si dicha variable abandona y vuelve a entrar en el alcance, no hay garantía que se borrará de nuevo.



out y ref son exactamente iguales, con la excepción de que no es necesario inicializar las variables antes de enviarlas al abismo. No soy tan inteligente, lo descifre de la biblioteca de MSDN :).

Sin embargo, para ser más explícitos sobre su uso, el significado del modificador es que si cambia la referencia de esa variable en su código, out y ref causarán que su variable de llamada también cambie la referencia. En el código a continuación, la variable ceo será una referencia al newGuy una vez que regrese de la llamada a doStuff. Si no fuera por ref (o fuera), la referencia no se cambiaría.

private void newEmployee() { Person ceo = Person.FindCEO(); doStuff(ref ceo); } private void doStuff(ref Person employee) { Person newGuy = new Person(); employee = newGuy; }


ref probablemente se ahogará en nulo ya que probablemente se espera que modifique un objeto existente. out espera nulo, ya que está devolviendo un nuevo objeto.


¿Por qué C # tiene ''ref'' y ''out''?

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

En contraste, los parámetros de referencia se consideran asignados inicialmente por el llamante. Como tal, no se requiere que el destinatario de la llamada asigne el parámetro de referencia antes del uso. Los parámetros de referencia se pasan tanto dentro como fuera de un método.

Entonces, out significa fuera, mientras que ref es para entrar y salir.

Estos corresponden estrechamente a los parámetros [out] y [in,out] de las interfaces COM, las ventajas de out parámetros son que los llamantes no necesitan pasar un objeto asignado previamente en los casos en que el método que se llama no lo necesita, esto evita tanto el costo de la asignación, como cualquier costo que pueda estar asociado con el cálculo de referencias (lo más probable es que sea COM, pero no infrecuente en .NET).


out especifica que el parámetro es un parámetro de salida, es decir, no tiene valor hasta que el método lo establece explícitamente.

ref especifica que el valor es una referencia que tiene un valor y cuyo valor puede cambiar dentro del método.


out parámetros de out se inicializan mediante el método llamado, los parámetros de ref se inicializan antes de llamar al método. Por lo tanto, out parámetros de out se usan cuando solo necesita obtener un valor de retorno secundario, los parámetros de ref se usan para obtener un valor y, potencialmente, devolver un cambio a ese valor (en segundo lugar al valor de retorno principal).


ref y out permiten que el método llamado modifique un parámetro. La diferencia entre ellos es lo que sucede antes de hacer la llamada.

  • ref significa que el parámetro tiene un valor antes de ingresar a la función. La función llamada puede leer y / o cambiar el valor en cualquier momento. El parámetro entra, luego sale

  • out significa que el parámetro no tiene valor oficial antes de entrar en la función. La función llamada debe inicializarla. El parámetro solo se apaga.

Aquí está mi manera favorita de verlo: ref es pasar variables por referencia. out es declarar un valor de retorno secundario para la función. Es como si pudieras 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í hay una lista más detallada de los efectos de cada alternativa:

Antes de llamar al método:

ref : La persona que llama debe establecer el valor del parámetro antes de pasarlo al método llamado.

out : el método del llamante no es necesario para establecer el valor del argumento antes de llamar al método. Lo más probable es que no deberías. De hecho, cualquier valor actual es descartado.

Durante la llamada:

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

out : el método llamado debe inicializar el parámetro antes de leerlo.

Llamadas remotas:

ref : el valor actual se calcula en la llamada remota. Costo extra de rendimiento.

out : no se pasa nada a la llamada remota. Más rápido.

Técnicamente hablando, podría usar siempre ref en lugar de out , pero out permite ser más preciso sobre el significado del argumento, y algunas veces puede ser mucho más eficiente.


  • Una variable de ref debe inicializarse antes de pasarla.
  • Se debe establecer out variable de out en la implementación de la función.
  • out parámetros externos pueden considerarse como variables de retorno adicionales (no de entrada)
  • ref parámetros de ref se pueden considerar como variables de entrada y de salida.