Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

С# — Делегаты

Делегаты C# аналогичны указателям на функции в C или C++. делегат является переменной ссылочного типа, которая содержит ссылку на метод. Ссылку можно изменить во время выполнения.

Делегаты особенно используются для реализации событий и методов обратного вызова. Все делегаты неявно получены из System.Delegate. класс.

Объявление делегатов

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

Например, рассмотрим делегата —

public delegate int MyDelegate (string s);

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

Синтаксис объявления делегата —

delegate <return type> <delegate-name> <parameter list>

Создание экземпляров делегатов

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

public delegate void printString(string s);
...
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);

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

Живая демонстрация
using System;

delegate int NumberChanger(int n);
namespace DelegateAppl {
   
   class TestDelegate {
      static int num = 10;
      
      public static int AddNum(int p) {
         num += p;
         return num;
      }
      public static int MultNum(int q) {
         num *= q;
         return num;
      }
      public static int getNum() {
         return num;
      }
      static void Main(string[] args) {
         //create delegate instances
         NumberChanger nc1 = new NumberChanger(AddNum);
         NumberChanger nc2 = new NumberChanger(MultNum);
         
         //calling the methods using the delegate objects
         nc1(25);
         Console.WriteLine("Value of Num: {0}", getNum());
         nc2(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
      }
   }
}

Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат —

Value of Num: 35
Value of Num: 175

Многоадресная рассылка делегата

Объекты-делегаты могут быть составлены с помощью оператора «+». Составной делегат вызывает двух делегатов, из которых он был составлен. Могут быть составлены только делегаты одного типа. Оператор "-" может использоваться для удаления делегата компонента из составного делегата.

Используя это свойство делегатов, вы можете создать список вызовов методов, которые будут вызываться при вызове делегата. Это называется многоадресной рассылкой. делегата. Следующая программа демонстрирует многоадресную рассылку делегата —

Живая демонстрация
using System;

delegate int NumberChanger(int n);
namespace DelegateAppl {
   class TestDelegate {
      static int num = 10;
      
      public static int AddNum(int p) {
         num += p;
         return num;
      }
      public static int MultNum(int q) {
         num *= q;
         return num;
      }
      public static int getNum() {
         return num;
      }
      static void Main(string[] args) {
         //create delegate instances
         NumberChanger nc;
         NumberChanger nc1 = new NumberChanger(AddNum);
         NumberChanger nc2 = new NumberChanger(MultNum);
         
         nc = nc1;
         nc += nc2;
         
         //calling multicast
         nc(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
      }
   }
}

Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат —

Value of Num: 75

Использование делегатов

В следующем примере демонстрируется использование делегата. Делегат printString может использоваться для ссылки на метод, который принимает строку в качестве входных данных и ничего не возвращает.

Мы используем этот делегат для вызова двух методов, первый выводит строку на консоль, а второй выводит ее в файл —

Живая демонстрация
using System;
using System.IO;

namespace DelegateAppl {

   class PrintString {
      static FileStream fs;
      static StreamWriter sw;
      
      // delegate declaration
      public delegate void printString(string s);

      // this method prints to the console
      public static void WriteToScreen(string str) {
         Console.WriteLine("The String is: {0}", str);
      }
      
      //this method prints to a file
      public static void WriteToFile(string s) {
         fs = new FileStream("c:\\message.txt",
         FileMode.Append, FileAccess.Write);
         sw = new StreamWriter(fs);
         sw.WriteLine(s);
         sw.Flush();
         sw.Close();
         fs.Close();
      }
      
      // this method takes the delegate as parameter and uses it to
      // call the methods as required
      public static void sendString(printString ps) {
         ps("Hello World");
      }
      
      static void Main(string[] args) {
         printString ps1 = new printString(WriteToScreen);
         printString ps2 = new printString(WriteToFile);
         sendString(ps1);
         sendString(ps2);
         Console.ReadKey();
      }
   }
}

Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат —

The String is: Hello World

Язык C

  1. C# Hello World — ваша первая программа на C#
  2. Ключевые слова и идентификаторы C#
  3. Переменные C# и (примитивные) типы данных
  4. Операторы С#
  5. Типы пользовательских функций в программировании на C
  6. Передать массивы функции в C
  7. Рукопашный бой среди сюрпризов на Economist Innovation Summit, поскольку делегаты призывали не заменять человеческие нав…
  8. Переменные и типы С++:int, double, char, string, bool
  9. С - Функции
  10. C - Битовые поля