Читаем Язык программирования C#9 и платформа .NET5 полностью

//                     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 определены три открытых метода. Главным методом в .NET Core является Invoke, т.к. он используется для вызова каждого метода, поддерживаемого объектом делегата, в синхронной манере; это означает, что вызывающий код должен ожидать завершения вызова, прежде чем продолжить свою работу. Довольно странно, но синхронный метод Invoke может не нуждаться в явном вызове внутри вашего кода С#. Вскоре будет показано, что Invoke вызывается "за кулисами", когда вы применяете соответствующий синтаксис С#.


На заметку! Несмотря на то что методы BeginInvoke и EndInvoke генерируются, они не поддерживаются при запуске вашего кода под управлением .NET Core. Это может разочаровывать, поскольку в случае их использования вы получите ошибку не на этапе компиляции, а во время выполнения.


Так благодаря чему же компилятор знает, как определять метод Invoke? Для понимания процесса ниже приведен код сгенерированного компилятором класса BinaryOp (полужирным курсивом выделены элементы, указанные в определении типа делегата):


sealed class BinaryOp : System.MulticastDelegate

{

  public int Invoke(int x, int y);

...

}


Первым делом обратите внимание, что параметры и возвращаемый тип для метода Invoke в точности соответствуют определению делегата BinaryOp.

Давайте рассмотрим еще один пример. Предположим, что определен тип делегата, который может указывать на любой метод, возвращающий значение string и принимающий три входных параметра типа System.Boolean:


public delegate string MyDelegate (bool a, bool b, bool c);


На этот раз сгенерированный компилятором класс можно представить так:


sealed class MyDelegate : System.MulticastDelegate

{

  public string Invoke(bool a, bool b, bool c);

...

}


Делегаты могут также "указывать" на методы, которые содержат любое количество параметров out и ref (а также параметры типа массивов, помеченные с помощью ключевого слова params). Пусть имеется следующий тип делегата:


public delegate string MyOtherDelegate(out bool a, ref bool b, int c);


Сигнатура метода Invoke выглядит вполне ожидаемо.

Подводя итоги, отметим, что определение типа делегата C# дает в результате запечатанный класс со сгенерированным компилятором методом, в котором типы параметров и возвращаемые типы основаны на объявлении делегата. Базовый шаблон может быть приближенно описан с помощью следующего псевдокода:


// Это лишь псевдокод!

public sealed class ИмяДелегата : System.MulticastDelegate

{

  public возвращаемоеЗначениеДелегата

      Invoke(всеВходныеRefиOutПараметрыДелегата);

}

Базовые классы System.MulticastDelegate и System.Delegate

Перейти на страницу:

Похожие книги

Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

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

Нил Форд , Билл де Ора , Майкл Хайгард

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT