Я думал, что экземпляр делегата является взаимозаменяемым с экземпляром функции.В чем разница между экземпляром делегата и указателем метода?
Возьмем следующий код:
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());
}
Оба способы вызова Окажись эквивалентными, и если вы используете только C#, вы никогда не увидите разницу (по крайней мере, я не до эта точка). Тем не менее, я недавно был неуправляемым кодом, который возвращался обратно в этот управляемый код, к ним относятся по-разному. Например, в одном сценарии я получаю сообщение об ошибке «Обратный вызов был сделан на сборнике собранных мусором», если я использую функцию непосредственно в качестве обратного вызова (хотя экземпляр объекта хранится вокруг). Использование «экземпляра делегата» устраняет проблему.
Есть ли кто-то, кто знает, в чем разница?
Как выглядит ИЛ? Есть ли какие-либо указания «под капотом», что к ним обычно относятся иначе? –