C#: Objetos son por referencia…

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.

image

Adicionalmente, para efectos de ejemplo, utilizaré un pequeño contenedor con una Lista Generica de Objetos “MyClass” la cual comenzamos así:

image

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:

image

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.

image

A este punto al ejecutar nuestra aplicación de ejemplo tenemos esta salida:

image

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:

image

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” :

image

Sorpresa! accesando al objeto con las variables “one” y “objectFromContainer”

image

en ambos casos obtendremos el mismo “Comment”… Aca la salida de nuestro programa:

image

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

Comparte Este Post:
  • Print
  • Digg
  • StumbleUpon
  • del.icio.us
  • Facebook
  • Yahoo! Buzz
  • Twitter
  • Google Bookmarks
  • FriendFeed

About fboiton

I'm a Software Developer specialized in Web Solutions for Large Scale and High Availability Applications, with more than 8 years of experience in Web Applications development. Software Architecture, Team Management and Continous Improvement are my bigger interests. Specialties ASP.NET, SQL Server, Web Development in general, Linux Servers, Software Architecture, Team Management.
This entry was posted in Desarrollo de Software and tagged , , , , . Bookmark the permalink.

Leave a Reply