Ich dachte, dass eine Delegat-Instanz mit einer Funktionsinstanz austauschbar ist.Was ist der Unterschied zwischen einer Delegat-Instanz und einem Methodenzeiger?
Nehmen Sie den folgenden Code ein:
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());
}
Beide Möglichkeiten des Aufrufs es gleichwertig zu sein scheinen, und wenn Sie nur mit C#, werden Sie nie den Unterschied sehen (zumindest habe ich nicht bis zu dieser Punkt). Allerdings wurde ich kürzlich unmanaged Code, der in diesen verwalteten Code zurückgerufen wurde, sie werden anders behandelt. Zum Beispiel, in einem Szenario, ich bekomme den Fehler "Ein Rückruf wurde auf einem Garbage Collected Delegate gemacht", wenn ich die Funktion direkt als Rückruf verwenden (obwohl meine Objektinstanz gehalten wird). Die Verwendung der "Delegate-Instanz" behebt das Problem.
Gibt es jemanden da draußen, der weiß, was der Unterschied ist?
Wie sieht der il aus? Gibt es einen Hinweis "unter der Haube", dass sie normalerweise anders behandelt würden? –