En su esencia tanto ref
y out
proporcionar un mecanismo para pasar la dirección de una variable a un método para que pueda ser actualizado - asignar a la ref
o out
parámetro actualiza la variable en el contexto del llamador. Donde difieren es en las garantías: out
garantiza que la variable se actualizará, ref
no.
Desde el otro lado de la llamada hay diferencias similares. out
No se garantiza que un parámetro de nuestro método contenga nada útil a la llegada y debe establecerse en un valor en algún momento, mientras ref
que se puede suponer que un parámetro tiene un valor y no necesitamos hacer nada específico con él.
Esta diferencia tiene un impacto en el análisis, la generación y la optimización del código que, aunque no es muy evidente para nosotros la mayor parte del tiempo, puede tener algunos efectos en la forma en que nuestros programas terminan operando. El generador de código puede diferir la asignación de la variable hasta inmediatamente antes de la llamada, el optimizador puede decidir que puede reordenar algunas operaciones de manera más efectiva en función del contrato, etc.
En términos de uso: como regla general, lo uso out
para situaciones en las que no me importa el contenido de la variable cuando llega como parámetro y ref
cuando lo hago.