// Argument #1: I4
// Argument #2: I4
// Argument #3: Class System.AsyncCallback
// Argument #4: Object
// 4 Parameters
// (1) ParamToken : Name : x flags: [none]
// (2) ParamToken : Name : y flags: [none]
// (3) ParamToken : Name : callback flags: [none]
// (4) ParamToken : Name : object flags: [none]
//
// Method #4
// -------------------------------------------------------
// MethodName: EndInvoke
// ReturnType: I4 (int32)
// 1 Arguments
// Argument #1: Class System.IAsyncResult
// 1 Parameters
// (1) ParamToken : Name : result flags: [none]
Как видите, в сгенерированном компилятором классе BinaryOp
Invoke, т.к. он используется для вызова каждого метода, поддерживаемого объектом делегата, в синхронной манере; это означает, что вызывающий код должен ожидать завершения вызова, прежде чем продолжить свою работу. Довольно странно, но синхронный метод Invoke может не нуждаться в явном вызове внутри вашего кода С#. Вскоре будет показано, что Invoke вызывается "за кулисами", когда вы применяете соответствующий синтаксис С#.На заметку!
Несмотря на то что методыBeginInvoke и EndInvoke генерируются, они не поддерживаются при запуске вашего кода под управлением .NET Core. Это может разочаровывать, поскольку в случае их использования вы получите ошибку не на этапе компиляции, а во время выполнения.Так благодаря чему же компилятор знает, как определять метод Invoke
BinaryOp (полужирным курсивом выделены элементы, указанные в определении типа делегата):sealed class BinaryOp
{
public int
...
}
Первым делом обратите внимание, что параметры и возвращаемый тип для метода Invoke
BinaryOp.Давайте рассмотрим еще один пример. Предположим, что определен тип делегата, который может указывать на любой метод, возвращающий значение string
System.Boolean:public delegate string MyDelegate (bool a, bool b, bool c);
На этот раз сгенерированный компилятором класс можно представить так:
sealed class MyDelegate
{
public string
...
}
Делегаты могут также "указывать" на методы, которые содержат любое количество параметров out
ref (а также параметры типа массивов, помеченные с помощью ключевого слова params). Пусть имеется следующий тип делегата:public delegate string MyOtherDelegate(out bool a, ref bool b, int c);
Сигнатура метода Invoke
Подводя итоги, отметим, что определение типа делегата C# дает в результате запечатанный класс со сгенерированным компилятором методом, в котором типы параметров и возвращаемые типы основаны на объявлении делегата. Базовый шаблон может быть приближенно описан с помощью следующего псевдокода:
// Это лишь псевдокод!
public sealed class
{
public
Invoke(
}
Базовые классы System.MulticastDelegate и System.Delegate
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT