Пользовательский делегат имеет конструктор, отличный от базовых классов - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь понять магию, происходящую за экраном в Пользовательском делегате, особенно в точке конструктора. Посмотрев внутри ключевого слова делегата с помощью отражателя Jet Brains, вы получите конструктор для автоматически сгенерированного класса , как показано в следующем коде IL:

.method public hidebysig specialname rtspecialname instance void 
.ctor
(
  object 'object', 
  native int 'method'
) runtime managed 
{} 

Если мы посмотрим на конструктор базового класса MulticastDelegate, этот конструктор будет отличаться от описанного выше в случае типа параметров . Смотрите следующий код IL:

.method family hidebysig specialname rtspecialname instance void 
.ctor
(
  object target, 
  string 'method'
) cil managed

  .maxstack 8
// [30 7 - 30 38]
IL_0000: ldarg.0      // this
IL_0001: ldarg.1      // target
IL_0002: ldarg.2      // 'method'
IL_0003: call         instance void System.Delegate::.ctor(object, string)
IL_0008: ret
} // end of method MulticastDelegate::.ctor

string 'method' не существует в автоматически сгенерированном конструкторе класса.

, поскольку параметр native int 'method' представляет адрес метода с использованием IntPtr struct (из моего текущего понимания делегатов), я не вижу никакой связи между этим значением и строкой 'name'.

Я смотрю в Microsoft Docs о MulticastDelegate Constructors Я видел, что эта строка представляет имя метода , а не его адрес

method String Имя метода, для которого создается делегат.

также искал здесь об этой точке, но я не смог найти конкретный ответ на эту разницу, вместо этого я нашел кое-что интересное из Jon skeet в этом Вопросе о конструкторах делегатов, как показано:

Хотя в большинстве случаев делегаты представляются просто другим типом пользовательского класса, они жестко контролируются. Реализации методов предоставляются VES, а не кодом пользователя. Единственными дополнительными членами, которые могут быть определены в типах делегатов, являются статические или методы экземпляра.

Я предполагаю, что во время выполнения компилятором VES происходит много вещей (согласно скиту), которые не могут быть видны отражателем.

Я немного озадачен этим моментом, в моей голове много возможностей, и я не знаю, прав я или нет. Кто-нибудь может дать мне причину этого изменения?!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...