Para entender qué hacen ref y out, es bueno recordar que las variables de tipos de referencia guardan un puntero a un objeto en memoria y no el valor en sí. Entonces, cuando "modificamos la variable", lo que hacemos es ir hacia donde el puntero nos indica, y editar el objeto. Podemos tener dos variables de tipos de referencia que apuntan hacia el mismo objeto. Una manera de visualizar esto es con un ejemplo.
Una clase es un tipo de referencia, y un struct es un tipo de valor. Si pasamos una clase como parámetro a un objeto, lo que estamos pasando es una referencia a un objeto, y no el objeto en sí, por lo que si modificamos la clase en el método que invocamos, entonces el objeto original se verá afectado; esto es totalmente opuesto a lo que ocurre con un tipo de valor. Veamos un ejemplo:
Como puedes ver, la variable de tipo PersonaClass (tipo de referencia) queda modificada en el método Main tras haber sido modificada en un método externo; en cambio, la variable de tipo PersonaStruct (tipo de valor) no queda modificada en el método Main. Esto es, porque los tipos de valor pasan el valor directamente al método (crean uno nuevo), mientras que el tipo de referencia pasa una referencia al objeto original.
Con ref y out puedes lograr el mismo efecto de los tipos de referencia en los tipos de valores, esto es, que cuando un tipo de valor lo pases como parámetro a un método y lo modifiques en dicho método, la variable original quedará modificada.
Antes de dar el ejemplo, damos la diferencia entre ref y out. Aunque ambos hacen lo mismo en términos de comportamiento, la diferencia radica en que los parámetros marcados como out deben ser asignados en el método que modifica de manera obligatoria, esto es porque se asume que el parámetro no ha sido inicializado, ref no tiene esta atadura. Ejemplo:
No hay comentarios:
Publicar un comentario