#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)