Versus [I]


Equivalencia Versus Identidad

La equivalencia depende del valor o estado de una instancia. Por ejemplo, objetos que tienen el mismo valor son equivalentes. La identidad es la ubicación de un objeto. Los objetos pueden ser equivalentes pero no tener la misma identidad.

En el siguiente ejemplo, las variables integer locala y localc son equivalentes (contienen el mismo valor) sin embargo, las variables no son idénticas porque ellas están guardadas en diferentes lugares en el Stack.


int locala = 5;

int local = 10;

int local = 5;

Cuando se asigna el valor a una variable de tipo valor, el valor de la variable es copiada, por lo tanto son equivalentes pero no idénticas:


locala = local;

Para tipos referencia, hay una sincronicidad de equivalencia e Identidad. Las relaciones de referencia que contienen el mismo valor son equivalentes e idénticas porque estas se refieren al mismo objeto. Asignando una referencia a otra referencia se crea un alias, el cual crea efectos secundarios no planeados. Por esta razón, hay que ser cuidadoso cuando se asignan referencias. El siguiente ejemplo muestra efectos secundarios no planeados:


namespace EquivalenciaIdentidad

{

    public class XInt

    {

        public int campo = 0;

    }

    class Program

    {

        static void Main(string[] args)

        {

            XInt objeto1 = new XInt();

            objeto1.campo = 5;

            XInt objeto2 = new XInt();

            objeto2.campo = 10;

<p>&nbsp;</p>

            // Se crea un alias y se pierde la segunda instancia

            objeto2 = objeto1;

            objeto1.campo = 15; // Efecto secundario no planeado

            Console.WriteLine("{0}", objeto2.campo);

        }

    }

}

Al ejecutarlo, el resultado va a ser 15. (?)

El objeto2 es asignado al objeto1. Por lo tanto son idénticos y equivalentes. Mejor dicho, objeto2 se ha vuelo un alias para objeto1, lo que significa que los cambios que reciba uno de ellos, afecta al otro.

Ref versus out

Cuando se pasa un parámetro por referencia, una referencia al objeto es pasada y no una copia del valor. Por lo tanto los cambios al parámetro en la función afectan el objeto actual y no a una copia. Por lo tanto,  los cambios al parámetro persisten más allá de la función llamada.

Al usar el atributo ref, debemos antes de pasar el parámetro inicializarlo. En el siguiente ejemplo se va a presentar un error:


public class XInt

    {

        public int campo = 5;

    }

    class Program

    {

        public static void MetodoA(ref XInt alias)

        {

            XInt campo1 = new XInt();

            alias = campo1;

        }

        static void Main(string[] args)

        {

            XInt objeto;

            MetodoA(ref objeto);

            Console.WriteLine(objeto.campo);

        }

    }

Ni siquiera deja compilar el código anterior, sale un mensaje de error: Uso de la variable local no asignada ‘objeto’.

Como el modificador ref, el modificador out pasa un parámetro por referencia, pero hay una gran diferencia. El parámetro out no tiene que ser inicializado. Si modificamos nuestro ejemplo anterior, pero cambiando el modificador ref por out, no se muestra un error y el código compila:


public class XInt

    {

        public int campo = 5;

    }

    class Program

    {

        public static void MetodoA(out XInt alias)

        {

            XInt campo1 = new XInt();

            alias = campo1;

        }

        static void Main(string[] args)

        {

            XInt objeto;

            MetodoA(out objeto);

            Console.WriteLine(objeto.campo);

        }

    }

El ejemplo anterior, muestra como resultado 5.

Deseas comentar o sugerir algo?

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s