2012-06-26 20 views
9

Así que soy nuevo en C# y estoy teniendo dificultades para comprender out. En lugar de sólo devolver algo de una funciónC# parámetros frente a devoluciones

using System; 
class ReturnTest 
{ 
    static double CalculateArea() 
    { 
     double r=5; 
     double area = r * r * Math.PI; 
     return area; 
    } 

    static void Main() 
    { 
     double output = CalculateArea(); 
     Console.WriteLine("The area is {0:0.00}", output); 
    } 
} 

comparar a este

using System; 
class ReturnTest 
{ 
    static void CalculateArea(out double r) 
    { 
     r=5; 
     r= r * r * Math.PI; 
    } 

    static void Main() 
    { 
     double radius; 
     CalculateArea(out radius); 
     Console.WriteLine("The area is {0:0.00}",radius); 
     Console.ReadLine(); 
    } 
} 

La primera de ellas es la forma por lo general lo haría. ¿Hay algún motivo por el que desee usar out en lugar de solo una declaración de devolución? Entiendo que ref permite la comunicación bidireccional, y que generalmente no debería usar ref a menos que la función esté haciendo algo con la variable que estoy enviando.

Sin embargo, ¿hay alguna diferencia entre las declaraciones de salida y devolución, como se muestra arriba? Sintaxis sabia ¿hay alguna razón para favorecer a uno u otro?

+8

Estudie 'Dictionary.TryGetValue' y' int.TryParse' y vea si esos ejemplos explican la utilidad de 'out'. –

+3

'out' se usa principalmente cuando necesita devolver múltiples valores no relacionados de un método. Además, a menudo se usa para simular punteros cuando interopera con código nativo a través de COM o p/invoke. – dlev

+1

Recuerde que en C/C++ tenemos punteros. Cuando pasa un puntero a una función, puede modificarla dentro de la función y el valor también cambiará en la función de llamada. hace más o menos lo mismo. – carny666

Respuesta

13

Un buen uso de out en lugar de return para que el resultado es el patrón Try que se puede ver en ciertas API, por ejemplo Int32.TryParse(...). En este patrón, el valor de retorno se utiliza para señalar el éxito o el fracaso de la operación (a diferencia de una excepción), y el parámetro out se usa para devolver el resultado real.

Una de las ventajas con respecto a Int32.Parse es la velocidad, ya que se evitan las excepciones. Algunos puntos de referencia se han presentado en esta otra pregunta: Parsing Performance (If, TryParse, Try-Catch)

1

Cuando se trata de una variable, el retorno y el retorno son correctos. Pero, ¿y si quisieras devolver más de 1 valor? Out ayuda en eso.

static void CalculateArea(out double r, out double Foo) 
{ 
    //Can return 2 values in terms of out variables. 
} 

static double CalculateArea(double r) 
{ 
    // Will return only one value. 
} 
2

Puede tener varios parámetros a cabo, por lo que si usted necesita devolver varios valores, es un poco más fácil que crear una clase especial para los valores de retorno.

+0

no puedo creer que no lo haya hecho Piense en esto gracias –

4

Solo el tiempo que tiendo a usar out es cuando necesito que me devuelvan varias cosas de un solo método. Out le permite evitar envolver varios objetos en una clase para devolver. Vea el ejemplo en el Microsoft Out page.

8

La palabra clave out se usa principalmente cuando desea devolver más de un valor de un método, sin tener que ajustar los valores en un objeto.

Un ejemplo es el método Int32.TryParse, que tiene un valor de retorno (un booleano que representa el éxito del intento) y un parámetro out que obtiene el valor si el análisis se realizó correctamente.

El método podría devolver un objeto que contuviera el booleano y el entero, pero que necesitaría para que el objeto se creara en el montón, reduciendo el rendimiento del método.

+0

Me pregunto también sobre la diferencia de rendimiento (si corresponde). Viniendo de un entorno C++, el argumento es que copiar un objeto cuando se devuelve por valor es más costoso. ¿Esto también es cierto para C#? Quiero decir, si construyes un nuevo objeto masivo dentro de la función y lo devuelves, ¿se copiará a lo que sea que estés asignando? ¿A diferencia de crear el objeto y cambiarlo a través de la palabra clave out? ¿O es esto irrelevante en C#? – Reasurria

+0

@Reasurria: si crea un objeto y lo devuelve, solo se devuelve la referencia, los objetos no se clonan. En los objetos .NET solo se clonan si específicamente los clonas, pasando objetos no crea nuevas copias. – Guffa

+0

Gracias lo tendré en cuenta. – Reasurria

Cuestiones relacionadas