Amir228
@Amir228

Откуда у делегатов метод Invoke?

Все созданные делегаты наследуют ведь класс Delegate. Так вот, в этом классе нету никакого Invoke(даже виртуального или абстрактного) но есть DynamicInvoke. Откуда делегаты берут этот метод? По факту делегат это ведь класс, компилятор сам Invoke добавляет? Если да то почему этот метод нельзя было закинуть сразу в Delegate? Как по мне более логичным будет просто закинуть этот метод в Delegate, ведь зачем нужен делегат если он не будет вызывать метод(ы).
  • Вопрос задан
  • 162 просмотра
Решения вопроса 1
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Во время компиляции создается класс, наследующийся от MulticastDelegate. Там и определяются.

StackOverflow

Делегат:
namespace ConsoleApp;

public delegate int Factory();


IL код
// Type: ConsoleApp.Factory 
// Assembly: ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
// MVID: 158825C2-2E1C-449E-A72A-66768D48C2ED
// Location: /home/user/RiderProjects/ConsoleApp/ConsoleApp/bin/Debug/net6.0/ConsoleApp.dll
// Sequence point data and variable names from /home/user/RiderProjects/ConsoleApp/ConsoleApp/bin/Debug/net6.0/ConsoleApp.pdb

.class public sealed auto ansi
  ConsoleApp.Factory
    extends [System.Runtime]System.MulticastDelegate
{

  .method public hidebysig specialname rtspecialname instance void
    .ctor(
      object 'object',
      native int 'method'
    ) runtime managed
  {
    // Can't find a body
  } // end of method Factory::.ctor

  .method public hidebysig virtual newslot instance int32
    Invoke() runtime managed
  {
    // Can't find a body
  } // end of method Factory::Invoke

  .method public hidebysig virtual newslot instance class [System.Runtime]System.IAsyncResult
    BeginInvoke(
      class [System.Runtime]System.AsyncCallback callback,
      object 'object'
    ) runtime managed
  {
    // Can't find a body
  } // end of method Factory::BeginInvoke

  .method public hidebysig virtual newslot instance int32
    EndInvoke(
      class [System.Runtime]System.IAsyncResult result
    ) runtime managed
  {
    // Can't find a body
  } // end of method Factory::EndInvoke
} // end of class ConsoleApp.Factory
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы