es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Por qué los delegados dentro de una lista son siempre iguales cuando se insertan a través de un ciclo for, pero no son iguales sin el ciclo?

Echemos un vistazo al siguiente ejemplo de código. Existe una lista de delegados y más tarde se insertan dos instancias dentro de esa lista secuencialmente.

class Client
{
    delegate void ActionListener(string message);

public static void Main()
{
    List<actionlistener> actionListenerList = new List<actionlistener>();

    actionListenerList.Add((message) => Console.WriteLine(message));
    actionListenerList.Add((message) => Console.WriteLine(message));

    if (actionListenerList[0].Equals(actionListenerList[1]))
    {
        Console.WriteLine("Two Delegates are equal");
    }
    else
    {
        Console.WriteLine("Two Delegates did not match");
    }
}
}

Salida:

Two Delegates did not match

Ahora, si modificamos el código y agregamos los delegados dentro de la lista utilizando un bucle for, entonces la salida es completamente diferente.

class Client
{
    delegate void ActionListener(string message);

public static void Main()
{
    List<actionlistener> actionListenerList = new List<actionlistener>();

    for (int i = 0; i < 2; i++)
    {
        actionListenerList.Add((message) => Console.WriteLine(message));
    }

    if (actionListenerList[0].Equals(actionListenerList[1]))
    {
        Console.WriteLine("Two Delegates are equal");
    }
    else
    {
        Console.WriteLine("Two Delegates did not match");
    }
}
}

Salida:

Two Delegates are equal

Creo que mi pregunta no necesita más explicación: ¿por qué se produce la diferencia después de usar un bucle for?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La diferencia en la salida se produce porque cuando los delegados se agregan secuencialmente, se crean instancias separadas del objeto delegate, cada una con una dirección de memoria única. Sin embargo, cuando los delegados se agregan dentro de un bucle for, hacen referencia al mismo objeto delegate y, por lo tanto, sus direcciones de memoria son las mismas. Esto se debe a que cada iteración del bucle está creando una nueva instancia del objeto delegate, pero todas están haciendo referencia a la misma dirección de memoria. Por lo tanto, al verificar la igualdad, los delegados agregados dentro del bucle for están haciendo referencia al mismo objeto y, por lo tanto, son iguales.

Comments are closed.