stored parameter c# out-parameters ref-parameters

parameter - ref out c#



¿En qué situaciones son útiles los parámetros ''fuera''(donde no se podría usar ''ref'')? (6)

Por lo que puedo decir, el único uso para out parámetros de out es que una persona que llama puede obtener múltiples valores de retorno de una sola invocación de método. ¡Pero también podemos obtener múltiples valores de resultados usando parámetros de ref !

Entonces, ¿hay otras situaciones donde out parámetros podrían ser útiles y donde no podríamos usar parámetros ref ?

Gracias.


Creo que un buen ejemplo es int.TryParse ()

http://msdn.microsoft.com/en-us/library/f02979c7.aspx

La razón principal por la que es mejor que ref es que no es necesario asignar un valor ficticio a la variable de retorno antes de llamar (incluso implícitamente).

Así que afuera te dice, y el compilador: "Esta var será asignada dentro del método. Y el valor inicial de la var, si lo hubiera, ni siquiera se verá".


La principal diferencia entre los dos es que si estamos usando ref , debemos inicializar esto antes de llamar y es opcional que asignemos un valor a nuestra variable ref en nuestro método.

Sin embargo, para los métodos de salida no tenemos que inicializarlos explícitamente, pero en nuestro método tenemos que asignarle algún valor, de lo contrario, generarán un error de tiempo de compilación.


Puedes mirar los parámetros de esta manera:

  • Los parámetros normales están en parámetros:
    Un valor puede ir a la función a través de tal parámetro; por lo tanto debe ser inicializado.

  • ref parámetros ref son parámetros in-out :
    Un valor puede entrar y salir de una función a través de dicho parámetro. Debido a lo anterior, también debe ser inicializado.

  • out parámetros de out son parámetros de salida :
    Se supone que un valor solo regresa de una función a través de tal parámetro; por lo tanto, no necesita ser inicializado.

Se me ocurrió esta forma de ver out parámetros de ref / out al estudiar la tecnología COM de Microsoft. IDL (lenguaje de descripción de la interfaz) se utiliza para describir las interfaces de los componentes COM, y con IDL, los parámetros se aumentan con los inout out , out e inout . Sospecho que .NET y C # han heredado parcialmente estos declaradores de COM, aunque con nombres ligeramente diferentes ( ref lugar de inout ).

Con COM, out parámetros de out se usan con frecuencia para recuperar el valor de retorno real de un método de interfaz, ya que el valor de retorno "real" a menudo ya se usa para devolver un código de éxito / error HRESULT .

Con .NET, creo que out parámetros tienen mucha menos importancia, incluso en los casos en los que desea devolver varios valores de un método (podría devolver objetos complejos o Tuple s en estas situaciones).


Sí, la diferencia entre ref y out es en términos de asignación definida:

  • Un parámetro de out no tiene que ser asignado definitivamente por la persona que llama antes de la llamada de método. Debe asignarse definitivamente en el método antes de que se devuelva normalmente (es decir, sin una excepción). La variable se asigna definitivamente a la persona que llama después de la llamada.

  • Un parámetro de ref tiene que ser asignado definitivamente por la persona que llama antes de la llamada de método. No tiene que asignarse un valor diferente en el método.

Supongamos que queremos cambiar int.TryParse(string, out int) para usar ref lugar. Por lo general, el código de llamada se ve así:

int value; if (int.TryParse(text, out value)) { // Use value } else { // Do something else }

Ahora, si usamos ref , tendríamos que dar un valor a valor antes de la llamada, por ejemplo:

int value = 0; if (int.TryParse(text, ref value)) { // Use value } else { // Do something else }

Obviamente no es una gran diferencia, pero da la impresión equivocada. Estamos asignando un valor que no tenemos intención de usar, y eso no es bueno para la legibilidad. Un parámetro de out indica que saldrá un valor del método (asumiendo que no hay una excepción) y que no necesita tener un valor para empezar.

Una de las sugerencias que he hecho para C # 5 (no tengo idea de si se tomará o no) es que un método con un parámetro de out debería ser considerado como un método que devuelve una tupla de valores. Combinado con un mejor soporte para tuplas, eso significaría que podríamos hacer algo como esto:

var (ok, value) = int.TryParse(text);

En este caso, ok y value se escribirían implícitamente en bool e int respectivamente. De esa manera queda claro lo que está pasando en el método ( text ) y lo que está saliendo (dos piezas de información: ok y value ).

Eso simplemente no estaría disponible si int.TryParse usara un parámetro ref lugar, ya que el compilador no puede saber si realmente se va a preocupar por el valor inicial del parámetro ref .


Un parámetro de out es útil cuando desea múltiples valores de resultados de un método. Técnicamente, podría utilizar un parámetro de ref para lograr el mismo objetivo, pero un parámetro de out hace un trabajo significativamente mejor en la intención de transmitir. Cuando usa ref , no está claro por qué lo hace en lugar de usar o en lugar de usar el resultado de la función. Presumiblemente, tiene la intención de cambiar el valor pasado, pero la razón por la que lo está cambiando no está clara simplemente a partir de la firma de la función.


Una diferencia importante es la siguiente:

Una variable pasada como un argumento de salida no necesita ser inicializada. Sin embargo, al parámetro de salida se le debe asignar un valor antes de que el método regrese.

(Un parámetro ref no requiere esto)

Fuente: http://msdn.microsoft.com/en-us/library/t3c3bfhx(VS.71).aspx