Manejo de punteros en c#, ¿realmente existen?

on martes, 20 de noviembre de 2012


Que tal, los que han usado c++, pascal, c o cualquier lenguaje de programación con acceso a la memoria RAM, es muy probable que estén familiarizados con los punteros o apuntadores, y para todos aquellos programadores de la nueva escuela que comenzaron usando c#, no tienen ni la mas remota idea de que son los punteros, ya que este lenguaje los oculta y hace transparenté el uso de estos.

Sin embargo, es necesario conocer en que momento son usados estos punteros en c#, ya que son totalmente transparentes para el programador.


Analicemos el siguiente bloque de código:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace aplicacionPunteros
{
    class Program
    {
        static void Main(string[] args)
        {
            Punto punto = new Punto(2, 4);
            Punto punto2 = punto;

            punto2.X = 888;

            Console.WriteLine(punto.X);
            Console.WriteLine(punto.Y);


            Console.WriteLine(punto2.X);
            Console.WriteLine(punto2.Y);

            Console.ReadKey();
        }
    }

    class Punto
    {
        public int X { get; set; }

        public int Y { get; set; }

        public Punto()
        {

        }

        public Punto(int x, int y)
        {
            this.X = x;

            this.Y = y;
        }
    }
}



Tenemos declarados dos objetos:


 Punto punto = new Punto(2, 4);
 Punto punto2 = punto;

al primero objeto  llamado punto se le están declarando un valor en X = 2, Y = 4, ahora bien, con el fin de establecer claro el ejemplo, declaramos un segundo objeto llamado punto2, y a continuación se le hace la asignación de punto. y se modifica la propiedad X a punto2

cuanso se asigna un objeto de la misma clase, algunas personas piensan que se realiza una clonacion del objeto, pero no es asi, lo que se esta haciendo es pasarle la referencia de su direccion de memoria en la cual esta almacenado el objeto, veamos graficamente:

tenemos la memoria RAM y al momento de hacer esta instruccion:

Punto punto = new Punto(2, 4);

estamos reservando ya sea en la memoria RAM o en el Heap.


memoria ram
y al momento de asignar al objeto punto2 el objeto punto, se aplica la misma teoría que en c++, y es donde se aplican los punteros.

es por eso que no piensen que un objeto es clonado a la hora de la asignacion, si no que es el mismo objeto.

ahora veamos el resultado de la corrida del programa anterior.








consola 

pero los dos valores fueron iguales, esto se debe a que cuando  se realizo el siguiente codigo:

Punto punto2 = punto;

punto2.X = 888;


punto fue asignado a punto2, y luego punto2.X se le asigno un nuevo valor, por lo tanto, punto2, esta haciendo referencia a la direccion de memoria donde fue instanciado el objeto punto.

0 comentarios:

Publicar un comentario