Anuncios

Bienvenidos sean a este post, en el post anterior vimos como al copiar un objeto ya creado en otro objeto nuevo, este copiaba todos los datos almacenados en el primero y su ubicacion en memoria por ende los dos trabajan en el mismo espacio de memoria y donde se modificaba uno, se modificaba al otro, esto se llama tipo valor por referencia o tipo referencia, dependiendo del autor, hoy veremos un poco mas a fondo este tema.

Anuncios

Esta forma de trabajar tiene sus pros y sus contras, en otros lenguajes mas antiguos trabajar por referencia (o apuntadores) nos permitia trabajar con la parte alta de la memoria, hablemos de la prehistoria:

Cuando los dinosaurios dominaban la faz de la tierra y MS-DOS las pantallas de las computadoras, este sistema operativo trabajaba solo con 640 KB de RAM, dejando el resto sin usar pero nosotros con C++ podiamos utilizarlo porque si bien no estaba asignada si estaba disponible y al hacer trabajar a nuestras variables con referencias nos permitia ubicar la informacion por fuera de este rango y siempre disponible….

El Tinchcius
Anuncios
Anuncios

Volviendo a la actualidad hoy no es tan necesario porque si bien se sigue desperdiciando memoria hoy disponemos de muchisimo mas y los sistemas operativos ya no trabajan con un memoria base y el resto como extendida, o si? nunca lo sabremos.

La cuestion que trabajar de esta forma es genial porque no trabajamos con el dato en si sino con una direccion de memoria, inconvenientes de trabajar asi, algunas veces se podia perder la referencia y eso desencadenara en datos sueltos en memoria generando errores con otras referencias, la contra mas importante que tenemos hoy es que al ser el mismo espacio de memoria podemos perder la informacion almacenada en la misma, generando inconsistencias en nuestra aplicacion. 😱

Para entender mejor este concepto vamos a crear un nuevo archivo llamado referencias.cs y le agregaremos el siguiente codigo:

Referencias.cs

using System;
using System.Collections.Generic;

class Autos
{
	public string marca;
	public string modelo;
	public int anyo;

	public Autos() {}
	public Autos(string a, string b, int c)
	{
		marca = a;
		modelo = b;
		anyo = c;
	}

	
}

public class Program
{
	public static int Main()
	{
		Autos auto1 = new Autos("vw","gol",1994);
		Console.WriteLine(auto1.marca + "\t" +
				auto1.modelo + "\t" +
				auto1.anyo);
		return 0;
	}
}
Anuncios

Este codigo es simple, contiene una clase llamada Autos, la cual posee tres propiedades (marca, modelo y anyo), luego tendremos un constructor predeterminado y un constructor para recibir tres datos y asignarlos a las propiedades de la clase, despues tendremos la clase Program la cual en el Main crearemos un nuevo objeto llamado auto1, le pasaremos los tres datos de nuestro auto y la siguiente linea se encarga de mostrar los tres datos asignados, si lo compilamos y ejecutamos veremos la sigujente salida:

C:\Users\tinchicus\Documents\Visual Studio 2019>referencias.exe
vw      gol     1994

C:\Users\tinchicus\Documents\Visual Studio 2019>
Anuncios

Con esto tenemos nuestro programa funcionando, para nuestro siguiente paso modificaremos el Main de la siguiente forma:

	public static int Main()
	{
		Autos auto1 = new Autos("vw","gol",1994);
		Autos auto2 = auto1;
		Console.WriteLine(auto1.marca + "\t" +
				auto1.modelo + "\t" +
				auto1.anyo);
		Console.WriteLine(auto2.marca + "\t" +
				auto2.modelo + "\t" +
				auto2.anyo);
		return 0;
	}
Anuncios

La modificacion realizada es simple, creamos un nuevo objeto llamado auto2 y le asignamos a auto1, como ambos objetos son del mismo tipo no tenemos problemas en hacer esto, luego le solicitamos que muestre los valores de auto1 y auto2, si lo compilamos y probamos obtendremos la siguiente salida:

C:\Users\tinchicus\Documents\Visual Studio 2019>referencias.exe
vw      gol     1994
vw      gol     1994

C:\Users\tinchicus\Documents\Visual Studio 2019>
Anuncios

En esta salida podemos como los dos objetos tienen los mismos datos dado que al asignarle auto1 a auto2 realizo una copia exacta de estructura y datos en el otro, vamos a realizar la siguiente modificacion en Main:

	public static int Main()
	{
		Autos auto1 = new Autos("vw","gol",1994);
		Autos auto2 = auto1;
		auto2.marca = "ford";
		Console.WriteLine(auto1.marca + "\t" +
				auto1.modelo + "\t" +
				auto1.anyo);
		Console.WriteLine(auto2.marca + "\t" +
				auto2.modelo + "\t" +
				auto2.anyo);
		return 0;
	}
Anuncios

Para este caso le dijimos que modifique el valor de marca en auto2, si lo compilan y probamos cual creen que sera el resultado?

C:\Users\tinchicus\Documents\Visual Studio 2019>referencias.exe
ford    gol     1994
ford    gol     1994

C:\Users\tinchicus\Documents\Visual Studio 2019>
Anuncios

Como podemos ver la modificacion en auto2 afecto a auto1 y esto es porque cuando dijimos que copia la estructura y datos en realidad dijimos una mentirijilla sino mas bien le asigna la direccion de memoria donde estan los datos, es decir la referencia de memoria, entonces toda modificacion realizada en este bloque de memoria afectara a los objetos o variables que apunten aqui, pero podemos solucionar esto? Si, debemos realizar la siguiente modificacion:

	public static int Main()
	{
		Autos auto1 = new Autos("vw","gol",1994);
		Autos auto2 = auto1;
		auto1 = new Autos();
		auto1.marca = "ford";
		auto1.modelo = "ecosport";
		auto1.anyo = 2010;

		Console.WriteLine(auto1.marca + "\t" +
				auto1.modelo + "\t" +
				auto1.anyo);
		Console.WriteLine(auto2.marca + "\t" +
				auto2.modelo + "\t" +
				auto2.anyo);
		return 0;
	}
Anuncios

Para este ejemplo agregamos la siguiente linea despues de creado el segundo objeto:

auto1 = new Autos();
Anuncios

Esta linea lo que hace es simplemente volver a crear un nuevo espacio de memoria para auto1 y apunta la referencia a ese nuevo bloque, las siguientes tres lineas se encargan de asignar la nueva informacion para auto1, si lo compilamos y probamos veremos la siguiente salida:

C:\Users\tinchicus\Documents\Visual Studio 2019>referencias.exe
ford    ecosport        2010
vw      gol     1994

C:\Users\tinchicus\Documents\Visual Studio 2019>
Anuncios
Anuncios

En este caso vemos como se asigno una nueva informacion para auto1 y este no afecto a auto2, si modificaramos a auto2 en este momento no deberia afectar a auto1 porque como dijimos antes ahora tienen diferentes referencias de memoria, lo bueno de esto es que pudimos mantener la informacion original de auto1 en auto2 y al hacer el cambio pudimos trabajar con otra informacion pero sin perder la primera, esto puede ser util para cuando necesitemos guardar una informacion antes de modificarla, esta forma de trabajo nos permite tener cualquier tipo de informacion, inclusive colecciones, pero tengan en cuenta el primer problema.

Anuncios
Recordatorio: Cuando asignamos un objeto a otro, se copia la referencia de memoria y todo lo modificado en este bloque de memoria afecta a todos los objetos que apunten al mismo.
Anuncios

En resumen, hoy hemos visto un tipo de dato como son por referencias, que es, para que sirve, porque se usa, como nos puede ayudar, el cuidado que debemos tener, como podemos copiar una a la otra, para que nos puede servir, y como podemos independizarlas, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

1.00 $