Здесь я собираюсь объяснить делегаты, многоадресные делегаты и их использование. Делегат - это тип, который содержит ссылку на метод (ы) в объекте. Он также называется указателем на тип безопасной функции. Можно сказать, что делегат - это тип, который определяет сигнатуру метода.
Когда вы создаете экземпляр делегата, вы можете связать его экземпляр с любым методом с совместимой подписью. Вы можете вызывать (или вызывать) метод через экземпляр делегата. Делегаты используются для передачи методов в качестве аргументов другим методам. Обработчики событий - это не что иное, как методы, которые вызываются через делегаты. Преимущества использования делегатов заключаются в инкапсуляции вызова метода от вызывающей стороны. Эффективное использование делегата повышает производительность приложения. Используется для асинхронного вызова метода. Есть некоторые свойства делегатов
Delegates are like C++ function pointers but are type safe.
Delegates allow methods to be passed as parameters.
Delegates can be used to define callback methods.
Delegates can be chained together; for example, multiple methods can be called on a single event.
Methods do not have to match the delegate signature exactly.
открытый делегат type_of_delegate Delegate_name () // Объявление
You can use delegates without parameters or with parameter list
If you are referring to the method with some data type then the delegate which you are declaring should be in the same format. This is why it is referred to as type safe function pointer. Here I am giving an example with String.
В следующем примере показана операция делегата:
namespace MyDelegate
{
class Program
{
private delegate void Show(string s);
// Create a method for a delegate.
public static void MyDelegateMethod(string me
ssage)
{
System.Console.WriteLine(message);
}
static void Main(string[] args)
{
Show p = MyDelegateMethod;
p("My Delegate");
p.Invoke("My Delegate");
System.Console.ReadLine();
}
}
}
Что такое Multicast Delegate?
Это делегат, который содержит ссылку на несколько методов. Многоадресные делегаты должны содержать только методы, которые возвращают void, иначе есть исключение времени выполнения.
delegate void MyMulticastDelegate(int i, string s);
Class Class2
{
static void MyFirstDelegateMethod(int i, string s)
{
Console.WriteLine("My First Method");
}
static void MySecondDelegateMethod(int i, string s)
{
Console.WriteLine("My Second Method");
}
static void Main(string[] args)
{
MyMulticastDelegate Method= new MyMulticastDelegate(MyFirstDelegateMethod);
Method+= new MyMulticastDelegate (MySecondDelegateMethod);
Method(1,"Hi"); // Calling 2 Methodscalled
Method-= new MyMulticastDelegate (MyFirstDelegateMethod);
Method(2,"Hi"); //Only 2nd Method calling
}
}
Здесь Delegate добавляется с помощью оператора + = и удаляется с помощью оператора - =.
Типы делегатов являются производными от класса Delegate в .NET Framework. Типы делегатов запечатаны - они не могут быть получены. Поскольку созданный делегат является объектом, его можно передать в качестве параметра или назначить свойству. Это позволяет методу принимать делегата в качестве параметра и вызывать его позже. Это известно как асинхронный обратный вызов.