пятница, 7 января 2022 г.

Что такое делегат в C#?

 


Делегаты и события C# .NET

 

В этом руководстве вы узнаете, что такое делегат в C# и как делегаты реализованы в C#. Делегат в C# — это тип, который используется для вызова метода. В этом уроке вы узнаете следующее.
  1. Что такое делегат в C#?
  2. Зачем нам нужны делегаты в C#?
  3. Каковы преимущества делегатов в C# и .NET?
  4. Какие существуют типы делегатов в C#?
  5. Как делегаты связаны с событиями в C#?
  6. Что такое одноадресные и многоадресные делегаты в C#?
  7. Что такое анонимный делегат в C#?
  8. Примеры кода делегата C#
 

1. Что такое делегат в C#?

 
Делегат — это один из базовых типов в .NET. Делегат — это класс, который используется для создания и вызова делегатов во время выполнения.
 
Делегаты С#
 
Делегат в C# похож на указатель функции в C или C++. Это новый тип объекта в C#. Делегат — это особый тип объекта, так как ранее весь объект, который мы использовали для определения, содержал данные, но делегат содержит только детали метода.
 

2. Зачем нужны делегаты в C#?

 
Программистам часто нужно передать метод как параметр других методов. Для этого мы создаем и используем делегатов.
Делегат — это класс, который инкапсулирует сигнатуру метода. Хотя его можно использовать в любом контексте, он часто служит основой для модели обработки событий в C# и .NET.
 
Один из хороших способов понять делегатов — думать о делегате как о чем-то, что дает имя сигнатуре метода.
 
Пример:


Example:
  1. public delegate int DelegateMethod(int x, int y);  

Любой метод, соответствующий сигнатуре делегата, который состоит из типа возвращаемого значения и параметров, может быть назначен делегату.
 
Это позволяет программно изменять вызовы методов, а также вставлять новый код в существующие классы. Если вы знаете подпись делегата, вы можете назначить свой собственный делегированный метод.
 
Эта возможность обращаться к методу как к параметру делает делегаты идеальными для определения методов обратного вызова.
 
Магия делегирования
 
В классе мы создаем его объект, который является экземпляром, но в делегате, когда мы создаем экземпляр, который также называется делегатом (означает, что что бы вы ни делали, вы получите делегата).
 
Делегат не знает и не заботится о классе объекта, на который он ссылается. Подойдет любой объект; все, что имеет значение, это то, что типы аргументов метода и тип возвращаемого значения совпадают с типом делегата. Это делает делегаты идеально подходящими для «анонимного» вызова.
 

3. Каковы преимущества делегатов?

 
Проще говоря, делегаты являются объектно-ориентированными, типобезопасными и очень безопасными, поскольку они гарантируют, что сигнатура вызываемого метода верна. Делегаты делают обработку событий простой и легкой.
 

4. Какие есть типы делегатов в C#?

 
Существует два типа делегатов: одноадресные делегаты и многоадресные делегаты.
 
Одноадресный делегат
 
Одноадресный делегат указывает на один метод за раз. В этом делегат назначается одному методу за раз. Они являются производными от класса System.Delegate.
 
Многоадресный делегат
 
Когда делегат заключен в более чем один метод, известный как многоадресный делегат.
 
В C# делегаты являются многоадресными, что означает, что они могут указывать более чем на одну функцию одновременно. Они являются производными от класса System.MulticastDelegate.
 

5. Как определить делегатов в C#?

 
 
Существует три этапа определения и использования делегатов:
 
1. Декларация
 
Чтобы создать делегата, вы используете ключевое слово delegate.

[attributes] [modifiers] delegate ReturnType Name ([formal-parameters]); 

  • Фактор атрибутов может быть обычным атрибутом C#.
  • Модификатор может быть одним или подходящей комбинацией следующих ключевых слов: новое, общедоступное, частное, защищенное или внутреннее.
  •  ReturnType может быть любым из типов данных, которые мы использовали до сих пор. Это также может быть тип void или имя класса.
  •  Имя должно быть допустимым именем C#. 
Поскольку делегат является определением метода, вы должны использовать круглые скобки, обязательные для каждого метода. Если этот метод не принимает никаких аргументов, оставьте скобки пустыми.

Example:
  1. public delegate void DelegateExample();  
В приведенном выше коде определяется делегат без папометров.
 
2. Создание экземпляра
  1. DelegateExample d1 = new DelegateExample(Display);  
The above code shows how a delegate is initiated.
 
3. Вызов 
  1. d1();  
Приведенный выше фрагмент кода вызывает делегат d1().
 

6. Что такое одноадресный делегат в C#?

 

Вот пример кода, демонстрирующий создание и использование одноадресного делегата..

  1. using System;    
  2. namespace ConsoleApplication5    
  3. {    
  4. class Program    
  5. {    
  6. public delegate void delmethod();    
  7.   
  8. public class P    
  9. {  
  10.   
  11. public static void display()    
  12. {    
  13. Console.WriteLine("Hello!");    
  14. }    
  15.   
  16. public static void show()    
  17. {    
  18. Console.WriteLine("Hi!");    
  19. }    
  20.   
  21. public void print()
  22. {
  23. Console.WriteLine("Print");
  24. }

  25. }
  26.   
  27. static void Main(string[] args)
  28. {
  29. // here we have assigned static method show() of class P to delegate delmethod()
  30. delmethod del1 = P.show;
  31.   
  32. // here we have assigned static method display() of class P to delegate delmethod() using new operator
  33. // you can use both ways to assign the delagate
  34. delmethod del2 = new delmethod(P.display);
  35. P obj = new P();
  36.   
  37. // here first we have create instance of class P and assigned the method print() to the delegate i.e. delegate with class    
  38. delmethod del3 = obj.print;
  39.   
  40. del1();
  41. del2();
  42. del3();
  43. Console.ReadLine();
  44. }
  45. }
  46. }

7. Что такое многоадресный делегат в C#?

 
Вот пример кода, демонстрирующий создание и использование многоадресного делегата.

  1. namespace delegate_Example4  
  2. {  
  3.   
  4. class Program  
  5. {  
  6. public delegate void delmethod(int x, int y);  
  7.   
  8. public class TestMultipleDelegate  
  9. {  
  10. public void plus_Method1(int x, int y)  
  11. {  
  12. Console.Write("You are in plus_Method");  
  13. Console.WriteLine(x + y);  
  14. }  
  15.   
  16. public void subtract_Method2(int x, int y)  
  17. {  
  18. Console.Write("You are in subtract_Method");  
  19. Console.WriteLine(x - y);  
  20. }  
  21. }  
  22.   
  23. static void Main(string[] args)  
  24. {  
  25.   
  26. TestMultipleDelegate obj = new TestMultipleDelegate();  
  27. delmethod del = new delmethod(obj.plus_Method1);  
  28.   
  29. // Here we have multicast  
  30. del += new delmethod(obj.subtract_Method2);  
  31. // plus_Method1 and subtract_Method2 are called  
  32. del(50, 10);  
  33. Console.WriteLine();  
  34. //Here again we have multicast  
  35. del -= new delmethod(obj.plus_Method1);  
  36. //Only subtract_Method2 is called  
  37. del(20, 10);  
  38. Console.ReadLine();  
  39. }  
  40. }  
  41. }  
Обратите внимание на делегатов:
  • Делегаты аналогичны указателям на функции C++, но являются типобезопасными.
  • Делегат дает имя сигнатуре метода.
  • Делегаты позволяют передавать методы в качестве параметров.
  • Делегаты могут использоваться для определения методов обратного вызова.
  • Делегаты могут быть связаны вместе; например, для одного события можно вызвать несколько методов.
  • В C# версии 2.0 представлена ​​концепция анонимных методов, которые позволяют передавать блоки кода в качестве параметров вместо отдельно определенного метода.
  • Делегат помогает в оптимизации кода.
  • Области использования делегатов
Самый распространенный пример использования делегатов — в событиях. 
  • Они широко используются в резьбе
  • Делегаты также используются для общих библиотек классов, которые имеют определенную общую функциональность.

8. Что такое анонимные делегаты в C#?

 
Вы можете создать делегат, но нет необходимости объявлять связанный с ним метод. Вам не нужно явно определять метод перед использованием делегата. Такой метод называется анонимным. Другими словами, если сам делегат содержит определение своего метода, он называется анонимным методом.
 
Код является примером использования анонимного делегата.
  1. using System;  
  2.   
  3. public delegate void Test();  
  4.   
  5. public class Program  
  6. {  
  7. static int Main()  
  8. {  
  9. Test Display = delegate()  
  10. {  
  11. Console.WriteLine("Anonymous Delegate method");  
  12. };  
  13.   
  14. Display();  
  15. return 0;  
  16. }  
  17. }  
Примечание. Вы также можете обрабатывать события анонимным методом.
 

9. Как делегаты связаны с событиями в C#?

 
События и делегат работают вместе. Событие — это ссылка на делегата, т. е. когда возникает событие, вызывается делегат. В терминах C# события представляют собой особую форму делегатов. 
 
События играют важную роль в пользовательском интерфейсе и программных уведомлениях. События и делегаты работают рука об руку, чтобы обеспечить связь между кодом из одного класса в другой класс. Когда что-то происходит в одном классе или в одной части кода, а другая часть кода нуждается в уведомлении, используются события. 
 
Событие AC# — это член класса, который активируется всякий раз, когда происходит событие, для которого оно было разработано. Он начинается с класса, который объявляет событие. Любой класс, включая тот же класс, в котором объявлено событие, может зарегистрировать один из своих методов для события. Это происходит с помощью делегата, который указывает сигнатуру метода, зарегистрированного для события. Ключевое слово event является модификатором делегата. Он всегда должен использоваться в связи с делегатом.
 
Делегат может быть одним из предопределенных делегатов .NET или делегатом, объявленным вами самостоятельно. В зависимости от того, что подходит, вы назначаете делегата событию, что фактически регистрирует метод, который будет вызываться при срабатывании события.
 

10. Как использовать события и делегаты в C#?

 
После объявления события оно должно быть связано с одним или несколькими обработчиками событий, прежде чем его можно будет вызвать. Обработчик событий — это не что иное, как метод, который вызывается с помощью делегата. Используйте оператор +=, чтобы связать событие с уже существующим экземпляром делегата.
 
Пример:
  1. obj.MyEvent += new MyDelegate(obj.Display);  
Событие имеет значение null, если у него нет зарегистрированных слушателей.
 
Хотя события в основном используются в программировании элементов управления Windows, они также могут быть реализованы в консольных, веб-приложениях и других приложениях.
 
Программа для создания пользовательского делегата и события Singlecast
  1. using System;  
  2. namespace delegate_custom  
  3. {  
  4. class Program  
  5. {  
  6. public delegate void MyDelegate(int a);  
  7.   
  8. public class XX  
  9. {  
  10. public event MyDelegate MyEvent;  
  11.   
  12. public void RaiseEvent()  
  13. {  
  14. MyEvent(20);  
  15. Console.WriteLine("Event Raised");  
  16. }  
  17.   
  18. public void Display(int x)  
  19. {  
  20. Console.WriteLine("Display Method {0}", x);  
  21. }  
  22. }  
  23.   
  24. static void Main(string[] args)  
  25. {  
  26.   
  27. XX obj = new XX();  
  28. obj.MyEvent += new MyDelegate(obj.Display);  
  29.   
  30. obj.RaiseEvent();  
  31. Console.ReadLine();  
  32. }  
  33. }  
  34. }  
    Программа для создания кастомного делегата мультикаста и события
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Linq;  
    4. using System.Text;  
    5.   
    6. namespace delegate_custom_multicast  
    7. {  
    8. class Program  
    9. {  
    10. public delegate void MyDelegate(int a, int b);  
    11.   
    12. public class XX  
    13. {  
    14. public event MyDelegate MyEvent;  
    15.   
    16. public void RaiseEvent(int a, int b)  
    17. {  
    18. MyEvent(a, b);  
    19. Console.WriteLine("Event Raised");  
    20. }  
    21.   
    22. public void Add(int x, int y)  
    23. {  
    24. Console.WriteLine("Add Method {0}", x + y);  
    25. }  
    26.   
    27. public void Subtract(int x, int y)  
    28. {  
    29. Console.WriteLine("Subtract Method {0}", x - y);  
    30. }  
    31. }  
    32.   
    33. static void Main(string[] args)  
    34. {  
    35.   
    36. XX obj = new XX();  
    37. obj.MyEvent += new MyDelegate(obj.Add);  
    38. obj.MyEvent += new MyDelegate(obj.Subtract);  
    39. obj.RaiseEvent(20, 10);  
    40. Console.ReadLine();  
    41. }  
    42. }  
    43. }  

    Conclusion






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

    Отправить комментарий

    Паттерн 'Репозиторий' в ASP.NET

      Последнее обновление: 1.11.2015         Одним из наиболее часто используемых паттернов при работе с данными является паттерн 'Репозито...