Pensé que una instancia de delegado era intercambiable con una instancia de función.¿Cuál es la diferencia entre una instancia de delegado y un puntero de método?
Tome el siguiente código:
delegate int AddDelegate(int a, int b);
AddDelegate DelegateInstance;
public void DoStuff()
{
//I can call this without a delegate "instance":
MethodThatTakesAdd(Add);
//I can also call it WITH a delegate "instance"
DelegateInstance = Add;
MethodThatTakesAdd(DelegateInstance);
}
public int Add(int a, int b)
{
return a + b;
}
public void MethodThatTakesAdd(AddDelegate addFunction)
{
Console.WriteLine(addFunction(1, 2).ToString());
}
Ambas formas de llamarlo parecen ser equivalentes, y si solamente va a utilizar C#, que nunca ver la diferencia (al menos no lo he hecho hasta este punto). Sin embargo, recientemente recibí un código no administrado que llamaba nuevamente a este código administrado, se tratan de manera diferente. Por ejemplo, en un escenario, obtengo el error "Se realizó una devolución de llamada en un delegado recolectado basura" si uso la función directamente como una devolución de llamada (aunque mi instancia de objeto se mantiene). El uso de la "instancia de delegado" soluciona el problema.
¿Hay alguien por ahí que sepa cuál es la diferencia?
¿Qué aspecto tiene? ¿Hay alguna indicación "bajo el capó" de que normalmente serían tratados de manera diferente? –