2011-11-21 21 views
9

En realidad, yo estoy haciendo una lista como parámetro de referencia de la siguiente manera:Práctica recomendada: parámetro de referencia o valor de retorno?

public static List ListMethod(List result) 

vi algunas personas haciendo de esta manera también:

public static void ListMethod(ref List result) 

Si no estoy equivocado, "mi" método también toma el list como parámetro de referencia, y usted debería poder usarlo de la misma manera que "other" en su método.

Pero me parece más "limpio" que ingrese un parámetro, haga algo con él y lo devuelva en el valor de retorno de los métodos.

¿Algún buen argumento a favor o en contra de un método u otro?

+0

¿Es una lista? ¿por qué enviarlo por ref qué es lo que estás tratando de lograr? –

+3

Sin pasar como ref/out, internamente una referencia que apunta a la copia de pila se hace en pila y se pasa al método de llamada. Si se usa ref, la misma referencia se usa como argumento aprobatorio. – Zenwalker

+1

¿Por qué crees que necesitas devolver una 'Lista' en tu primer método y no devolver nada en el segundo? – BoltClock

Respuesta

30

Es probable que no es necesario utilizar ref - pero no es una diferencia.

Normalmente, cuando veo personas que usan ref para los parámetros de tipo de referencia, es porque no entienden cómo funciona el paso de parámetros. Pero si su método tiene algo como esto:

result = new List(); 
... 

continuación, en el primer caso la persona que llama no va a ver el cambio, mientras que en el segundo caso la variable de la persona que llama será cambiado para referirse al nuevo objeto.

Vea mi article on parameter passing para obtener más detalles.

+0

Gracias 'Jon Skeet' – Dotnet

3

Si solo está devolviendo una Lista, siempre debe usar la primera ya que muestra esa intención.

La versión con ref me dice que puedo comenzar con una lista, y su método modificará la lista que envié, o incluso la cambiará con otra. Si esa es tu intención, haz eso.

Pero si el método siempre devuelve una nueva lista, use un valor de retorno en lugar de un parámetro ref.

Una nota en el lado: usted podría utilizar en lugar de outref para mostrar sus intenciones de volver una nueva lista, pero esto es sólo una buena práctica si usted está utilizando el valor de retorno para otra cosa.

11

No, su método no usa un parámetro ref. El valor predeterminado es pass by value.

La diferencia es que su método solo puede modificar el contenido de su lista pero no la referencia a la que apunta el parámetro result.

¿Cuál es el mejor enfoque? Depende de lo que su método debe hacer.

Cuando su método modifica la lista o devuelve datos nuevos, debe usar el valor de retorno. Es mucho mejor entender lo que hace su código que usar un parámetro ref.

Otro beneficio de los valores de retorno es la capacidad de utilizar el método de encadenamiento.

Se puede escribir un código como el que pasa el parámetro de lista de un método a otro:

ListMethod1(list).ListMethod2(list)... 
+3

+1 por la capacidad de hacer el método de encadenamiento. Incluso puede hacer eso * y * modificar un parámetro también, si realmente lo desea; un 'resultado de retorno;' no es muy caro en términos de LOC, CPU o complejidad, y puede hacer la vida mucho más fácil para el consumidor de la función. –

1

Una cosa especial acerca de parámetros ref aquí es que - "Una variable pasada con ref se ha de ajustar en primer lugar. ". Por lo tanto, si desea que el método de llamada sea estricto para asignar un valor antes de la llamada, probablemente pueda usar los parámetros de referencia.

Cuestiones relacionadas