C # proporciona la ref
y la out
palabra clave para hacer que los argumentos se pasen por referencia. La semántica de los dos es muy similar. La única diferencia está en la inicialización de la variable con bridas:
ref
requiere que la variable se inicialice antes de pasarla a la función,out
no lo hace.out
requiere que la variable se inicialice dentro de la función,ref
no.
Los casos de uso de estas dos palabras clave también son casi los mismos, y su uso demasiado frecuente es considerado un olor a código (aunque hay casos de uso válidos como el TryParse
y los TryGetValue
patrones).
Debido a esto, alguien podría explicar, ¿por qué hay dos herramientas muy similares en C # para casos de uso tan limitados?
Además, en MSDN , se afirma que tienen un comportamiento de tiempo de ejecución diferente:
Aunque las palabras clave ref y out provocan un comportamiento de tiempo de ejecución diferente, no se consideran parte de la firma del método en tiempo de compilación.
¿Cómo es diferente su comportamiento en tiempo de ejecución?
Conclusión
Ambas respuestas parecen correctas, gracias a ambos. Acepté jmoreno 's porque es más explícito.
ref
en C ++; a punteros al puntero de objeto (o primitivo) en cuestión. es decir,Int32.TryParse(myStr, out myInt)
(C #) se "ejecuta" de la misma manera que loint32_tryParse(myStr, &myInt)
haría (C); La única diferencia son algunas restricciones impuestas por el compilador para evitar errores. (No voy a publicar esto como respuesta porque puedo estar equivocado acerca de cómo funciona esto detrás de escena, pero así es como imagino que funciona [porque tiene sentido])