Тут я збираюся пояснити делегатів, делегатів з декількома розсилками та їх використання. Делегат - це тип, який містить об'єкт (и) посилання на об'єкт. Його також називають покажчиком безпечної функції типу. Можна сказати, що делегат - це тип, який визначає підпис методу.
Коли ви створюєте екземпляр делегата, ви можете пов’язати його примірник із будь-яким методом із сумісним підписом. Ви можете викликати (або викликати) метод через екземпляр делегата. Делегати використовуються для передачі методів як аргументів іншим методам. Обробники подій - це не що інше, як методи, які викликаються через делегатів. Переваги використання делегатів полягають у тому, що інкапсуляція виклику методу від абонента Ефективне використання делегата покращує продуктивність програми, що використовується для асинхронного виклику методу. Є деякі властивості делегатів
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();
}
}
}
Що таке багатоадресний делегат?
Це делегат, який містить посилання на більш ніж один метод. Делегати для багатоадресної передачі повинні містити лише методи, які повертають недійсність, інакше є виняток під час виконання.
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 в .NET Framework. Типи делегата запечатані - їх неможливо отримати. Оскільки створений делегат є об'єктом, він може передаватися як параметр або присвоюватися властивості. Це дозволяє методу прийняти делегата як параметр і викликати делегата через деякий пізній час. Це відоме як асинхронний зворотний зв'язок.