Каково различие между экземпляром делегата и указателем метода?

действительно ли это - действительно старая версия IE? если так, попробуйте:

<meta http-equiv="refresh" content="0;url=http://example.com/"> </meta>

Этому нужен пробел. Редактор HTML будет жаловаться, но просто игнорировать его.

9
задан Arsen Mkrtchyan 5 November 2009 в 16:59
поделиться

3 ответа

Исправление терминологии: вместо указателя метода более подходящим термином является группа методов.

С точки зрения функциональности эти два оператора эквивалентны. То есть они производят почти одинаковые ИЖ. Разница в том, где хранится значение делегата.

В первом случае вы напрямую передаете группу методов Add в MethodThatTakesAdd. Это приводит к созданию значения временного делегата, которое затем передается в MethodThatTakesAdd. Это значение делегата подлежит сборке мусора в момент возврата MethodThatTakesAdd, поскольку оно не сохраняет значение.

Во втором случае вы назначили делегат полю внешнего экземпляра. Это обычно увеличивает время жизни делегата и, следовательно, снижает вероятность его сбора мусора во время вашего вызова pinvoke.

13
ответ дан 4 December 2019 в 12:19
поделиться

Делегаты - это классы, которые вызываются и имеют аналогичное поведение указателям на функции. Делегат внутренне хранит адрес вызываемой функции (т. Е. Указатель функции), но также предоставляет другие функции, такие как преобразование нескольких типов и сохранение списка вызовов; вы можете по существу вызывать множество функций одной и той же подписи с одним экземпляром делегата следующим образом.

public void DoStuff()
{
    DelegateInstance += Add;
    DelegateInstance += AnotherAdd;
    DelegateInstance += YetAnotherAdd;

    // Invoke Add(100, 200), AnotherAdd(100, 200), and YetAnotherAdd(100, 200)
    DelegateInstance(100, 200);
}

Что касается вашего примечания об эквивалентности MethodThatTakesAdd (Add) и MethodThatTakesAdd (DelegateInstance) , если вы посмотрите на MSIL, который компилятор C # создает для строки MethodThatTakesAdd (Add) , вы заметите, что компилятор создает делегат и обертывает для вас метод Add () .

4
ответ дан 4 December 2019 в 12:19
поделиться

Хотя делегаты предоставляют синонимичные функции в C # как указатели функций в C или C ++, между ними есть существенные различия. Ключевым среди них является то, что делегат - это класс , а не указатель.

Короче говоря, приведение делегата к указателю не даст вам ссылку на функцию или метод, и поэтому его нельзя использовать для вызова метода по ссылке из неуправляемого кода.

0
ответ дан 4 December 2019 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: