Программирование на языке си ( с ) | C Sharp (Си шарп) с нуля. Сортировки | Массивы | Функции

Использование и объявление делегатов в C shapr (си шарп)

   Делегаты в C shapr (си шарп)

Делегаты служат для тех ситуаций, когда нужно передать в качестве параметра методу другой метод. Мы раньше всегда передавали в качестве аргументов только данные.

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

Такая информация будет известна лишь в ходе выполнения. Для выхода из серых туч приведу пару примеров:

  1. Потоки
  2. Для запуска нового потока, который будет работать параллельно с нашей основной программой, используется метод Start. В качестве аргумента этому методу передается тот метод, выполнение которого мы хотим запустить параллельно основной программе.

  3. События
  4. Частенько нам придется иметь дело с событиями. Особенно таких ситуаций будет множество в программировании графического интерфейса. При наступлении события система уже знает, какой метод нам нужно вызвать. Эта процедура выполняется с помощью передачи в качестве аргумента параметра - делегата.

В языках С/С++ передача функции в качестве аргумента осуществлялась по ее адресу. Но при этом не соблюдалась безопасность типов, да и в Объектно Ориентированном Программировании обычно все методы находятся в классах. Поэтому функция редко бывает в изоляции.

Поэтому в среде .NET вместо передачи метода по его адресу, информацию о нем передают в форме делегата.

Делегат в C shapr (си шарп) - простейший тип объекта. Другие объекты могли хранить данные, а делегат хранит только информацию о методе.

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

При объявлении класса выделали два действия:

  1. определяли класс
  2. т.е. сообщали программе, из чего он состоит

  3. создавали экземпляр класса
  4. если, конечно, методы класса не статические

Я не зря привел пример объявления класса. Делегаты объявляются точно так же. Т.е. вначале мы даем определение делегата, который хотим использовать. Его определение заключается в сообщении программе, какой именно метод будет описывать наш делегат. Далее, мы создаем экземпляр делегата (можно создать несколько экземпляров).

delegate void MethodDelegat (int chislo);

В нашем случае мы создаем делегат с именем MethodDelegat, каждый экземпляр которого может содержать указатель метод. Причем этот метод принимает только один параметр типа int и возвращает тип void. Ключевое слово delegate является обязательным.

Как вы видите, в отличие от механизма в С/С++ тут мы сразу сообщаем с каким именно прототипом функций мы будет иметь дела. Т.е. безопасность типов соблюдается.

   Использование делегатов в C shapr (си шарп)

Давайте для ясно сразу обратимся к примеру, как используются делегаты:

public delegate string GetString ();
static void Main() {
   int chislo = 50;
   GetString str = new GetString (chislo.ToString);
   Console.WriteLine (GetString());
}

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

При копировании ( использовании ) материала размещайте ссылку на сайт www.mir-koda.ru