Все ли методы в делегате обрабатываются одинаково или некоторые из них особенные?

#c# #delegates

#c# #делегаты

Вопрос:

Недавно я узнал, что делегат — это указатель не на ОДНУ функцию, а на СПИСОК функций (называемый «список вызовов»). Я хотел бы знать, есть ли какая-либо разница между методами в списке: является ли один из них или несколько из них каким-то особенным? Некоторые из них хранятся где-то еще, а не в списке вызовов?

Я спрашиваю, потому что нашел свойство Delegate.Method в документации MSDN (https://msdn.microsoft.com/en-us/library/system.delegate.method (v = vs.110).aspx) где говорится

Делегировать.Свойство метода:

Возвращает метод, представленный делегатом.

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

Комментарии:

1. На самом деле он возвращает последний метод, а не первый. Если вы добавите методы, которые возвращают значение, делегат вернет только последнее. Я думаю, вот почему.

2. В C # все типы делегатов являются производными от MulticastDelegate, а не Delegate . Итак, вам следует использовать его метод GetInvocationList() для просмотра целевых методов.

Ответ №1:

Только что протестировал это:

 public class Program
{
    public delegate int Operation(int x, int y);

    public static int Add(int x, int y)
    {
        return x y;
    }

    public static int Sub(int x, int y)
    {
        return x-y;
    }

    public static void Main()
    {
        Operation o = new Operation(Add);
        o  = Sub;
        Console.WriteLine(o.Method);
    } 
}
  

И результатом является последний назначенный метод:

Int32 Sub(Int32, Int32)

Даже если свойство метода вернет последний метод, оно не обрабатывает его по-другому и не отличается от других других методов (за исключением того факта, что это последний метод, который был добавлен в delagate, и согласно комментарию @Dennies_E, если делегат вернет какое-либо значение, это будет последнее возвращаемое значение метода, в данном случае возвращаемое значение подметода).

Если вы хотите увидеть все методы назначения, вы можете использовать Delegate.Метод GetInvocationList:

 foreach(Opeartion operation in o.GetInvocationList())
{
    Console.WriteLine(operation.Method);
}
  

При этом будут выведены все методы в том порядке, в котором они были добавлены:

Int32 Add(Int32, Int32)

Int32 Sub(Int32, Int32)