Делегаты C#. Invoke

430
06 января 2017, 08:24

В качестве примера возьмем следующий код и опустим все подробности.

private void Example(Func<bool> exampleFunction)
{
    bool result = exampleFunction();    // 1
    result = exampleFunction.Invoke();  // 2
}

В чем различие между первым и вторым вызовом функции? Опишите ситуации в которых важно применять либо первый, либо второй вызов делегата.

На MSDN указано:

Вызывает метод или конструктор, представленный текущим экземпляром, используя указанные параметры.

Answer 1

На самом деле ваш объект exampleFunction имеет тип Func<bool>, его базовый тип MulticastDelegate, а у этого типа базовый тип Delegate (http://ideone.com/I99DiH).

Для потомков типа Delegate CLR предоставляет метод Invoke с сигнатурой, соответствующей объявлённой сигнатуре делегата. Из MSDN:

The common language runtime provides an Invoke method for each delegate type, with the same signature as the delegate. You do not have to call this method explicitly from C#, Visual Basic, or Visual C++, because the compilers call it automatically. The Invoke method is useful in reflection when you want to find the signature of the delegate type.

Это значит, что разницы нет, и обычно проще использовать просто вызов со скобками.

Несколько отдельных случаев, при которых Invoke имеет смысл использовать:

  • Рефлексия. Имея объект делегатного типа, можно произвести вызов его через Invoke.
  • Новый оператор ?.: вместо

    if (exampleFunction != null)
        exampleFunction();
    

    можно написать более изящное

    exampleFunction?.Invoke();
    
READ ALSO
FarseerPhysics MonoGame

FarseerPhysics MonoGame

Всем приветНачал писать игру и пришел момент когда надо перемещаться персонажем

360
Фильтрация данных в DataGridView с помощью LINQ

Фильтрация данных в DataGridView с помощью LINQ

Есть пустой DataGridViewкоторый привязан к источнику данных, и настроен на отображения двух столбцов Id и Name

824
Когда используется Entity SQL?

Когда используется Entity SQL?

Когда к нему прибегают?

334