Varias veces se que hemos instanciado objetos por todos lados, y es más… cuántas veces hemos creado métodos donde recibimos un objeto, lo manipulamos y al final lo retornamos para asignarlo nuevamente a la variable que originalmente enviamos a método… uff! hasta yo mismo creo que me enredé….
A ver… C# nos dice que LAS CLASS INTANCES SON POR REFERENCIA MIENTRAS QUE LAS STRUCT INSTANCES(struct, enum, int, bool, chars… ) SON POR VALOR.
No voy a adentrarme esta vez en lo que implica el último párrafo con relación al uso de memoria o las struct instances y me enfocaré esta vez al título de este post: “C#: Objetos son por referencia…” con una pequeña Console Application.
Partimos de una clase que en si misma tendrá algunas properties y la responsabilidad de instanciarse a partir de un set de datos.
Adicionalmente, para efectos de ejemplo, utilizaré un pequeño contenedor con una Lista Generica de Objetos “MyClass” la cual comenzamos así:
Luego en nos vamos a nuestra console application, en donde primero creamos 2 instancias, es decir, tendremos 2 variables que apuntan a 2 objetos diferentes:
Cada una de las variables únicamente son apuntadores a los objetos. Con esto, cuando los enviamos como parámetros al método “AddAnMarkAsSaved”, dicho método estará modificando uno a uno y agregando dicha referencia a la Lista Genérica del Contenedor.
A este punto al ejecutar nuestra aplicación de ejemplo tenemos esta salida:
Una vez instanciado un objeto, las diferentes referencias que podamos tener al mismo, nos permitirán accesarlo, ojo… esto implica modificarlo… así que si pasamos por alto esto, podemos llegar a modificar “inconscientemente” el estado de un objeto cambiando lo que en nuestra aplicación realmente necesitamos.
Ohhh… Y entonces esto quiere decir que si extraigo el objeto de la lista que está en el contenedor y lo modifico, estoy cambiando el mismo objeto referenciado por las primeras variables?¿?¿?
Respuesta: SI!
Veamoslo en código, primero agreguemos a nuestro contenedor el método que nos retorne un objeto MyClass por su Id:
Luego, si obtenemos de la lista el objeto cuyo Id sea el mismo que el objeto que referencia la variable “one” y le modificamos su “Comment” :
Sorpresa! accesando al objeto con las variables “one” y “objectFromContainer”
en ambos casos obtendremos el mismo “Comment”… Aca la salida de nuestro programa:
En resumen, cada vez que asignamos una variable donde hayamos instanciado un objeto a otra variable, o la pasamos como parametro a un método, lo que estamos haciendo realmente es ENVIAR UNA REFERENCIA a donde se encuentra el objeto en memoria. Es un juego de apuntadores donde podemos llegar a caer en problemas serios en nuestras aplicaciones si descuidamos este tema
Acá el link a la MSDN Library por si desean adentrarse un poco mas en este tema:
Objects (C# Programming Guide)
En este URL el código del ejemplo








