Подтвердить что ты не робот

Цель делегатов

Duplicate:

Разница между событиями и делегатами и соответствующими приложениями

В чем преимущества делегатов?

Где я могу использовать делегатов?

Интересно, какая цель делегатов. Я не использовал их так много и не могу думать о чем-то.

В моих курсах написано, что делегат является синим шрифтом для всех методов, соответствующих его сигнатуре.

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

Я читал, что С# реализует события как делегаты, которые документируются как:

//Summary: Represents the method that
will handle an event that has no event
data.

//Parameters:

//sender: The source of the event.

//e: An System.EventArgs that contains no event data.

[Serializable]

[ComVisible(true)] 

public delegate void EventHandler(object sender, EventArgs e);

Тем не менее, это немного запутанно. Может ли кто-нибудь дать хороший, полезный пример этой концепции?

4b9b3361

Ответ 1

Да,

Ты почти там. Делегат ссылается на метод или функцию, которые должны быть вызваны..NET использует события, чтобы сказать.. когда кто-то нажимает эту кнопку, я хочу, чтобы вы выполнили эту часть кода.

Например, при использовании приложения GPS:

public delegate void PositionReceivedEventHandler(double latitude, double longitude);

Это говорит о том, что метод должен принимать два удвоения в качестве входов и возвращать пустоту. Когда мы приходим к определению события:

public event PositionReceivedEventHandler PositionReceived;  

Это означает, что событие PositionRecieved вызывает метод с тем же определением, что и  Определен делегат PositionReceivedEventHandler. Поэтому, когда вы делаете

PositionRecieved += new PositionReceivedEventHandler(method_Name);

Имя метода должно соответствовать делегату, чтобы мы знали, как выполнить метод, какие параметры он ожидает. Если вы используете конструктор Visual Studio для добавления некоторых событий к кнопке, например, все это будет работать над делегатом, ожидающим объект и параметр EventArgs.

Надеюсь, что это поможет...

Ответ 2

Как вы отметили, делегат - это способ создания подписи для вызова метода. Есть много отличных примеров использования делегатов, но тот, который действительно открыл мой разум, - это пример.

public delegate Duck GetDuckDelegate();

public GetDuckDelegate GiveMeTheDuckFactoryMethod(string type)
{
  switch(type)
  {
    case "Rubber":
      return new GetDuckDelegate(CreateRubberDuck);
    case "Mallard":
      return new GetDuckDelegate(CreateMallardDuck);
    default:
      return new GetDuckDelegate(CreateDefaultDuck);
  }
}

public Duck CreateRubberDuck()
{
  return new RubberDuck();
}

public Duck CreateMallardDuck()
{
  return new MallardDuck();
}

public Duck CreateDefaultDuck()
{
  return new Duck();
}

Затем, чтобы использовать его

public static void Main() {
  var getDuck = GiveMeTheDuckFactoryMethod("Rubber");
  var duck = getDuck();
}

Возможно, шаблон Factory был бы лучшим способом для этого, но я просто придумал этот пример "на лету" и подумал, что он доказал, что делегаты можно рассматривать как объекты

Ответ 3

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

Например,.Net имеет метод под названием Array.ForEach, который принимает делегат и массив и вызывает делегат для каждого элемента массива.

Поэтому вы можете написать

int[] arr = new int[] { 1, 2, 4, 8, 16, 32, 64 };
Array.ForEach(arr, new Action<int>(Console.WriteLine));

Этот код вызовет Console.WriteLine для каждого числа в массиве.

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

Ответ 4

Я могу предоставить вам пример с использованием архитектуры веб-приложения:

Как правило, с помощью веб-приложения вы можете предоставить фронт-контроллер, который получает запросы от многих клиентов. Мы могли бы поместить все наши методы в фронт-контроллер для работы с различными типами запросов от клиентов. Однако это становится немного громоздким. Вместо этого мы можем использовать делегатов для инкапсуляции функций для разных запросов. Мы могли бы:

  • Делегат проверки подлинности
  • Делегирование управления пользователями

и т.д. Таким образом, это простой способ разделить функциональность на логические куски - делегаты. Структура Struts основана на этом способе работы (классы ActionServlet и Action).

Ответ 6

Многие люди изначально путаются с реальной потребностью в делегатах и ​​событиях. Я был одним из них, и мне потребовалось некоторое время, чтобы понять это:-). Недавно ответил на аналогичный запрос на форумах ASP.NET и подумал, что было бы хорошо, если бы я создал сообщение в блоге по этой теме! Вот запрос:

"Я читал пример где-то в классе банка, что, если достигается минимальный баланс, вам нужно сообщить остальной части приложения, что мин достиг, но мы не можем этого сделать, просто вызвав обычный метод. например: скажем, когда мы вычитаем некоторую сумму из баланса, и если минимум достигнет, тогда вызовите какой-то метод, чтобы принять какое-то действие, я совершенно не понимаю, зачем нам нужны делегаты и пользовательские события здесь? "

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

Например: подумайте, что ОС Windows - это система, и мы пишем код (на любом языке), где мы хотим захватить событие, например mouse_click(). Теперь как наша программа узнает, что щелчок мыши произошел? Мы можем использовать для него код низкого уровня, но поскольку ОС уже обрабатывает код низкого уровня, лучше всего захватить событие, поднятое ОС.

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

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

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

Надеюсь, что это немного очистит!

Ответ 7

Делегаты, насколько мне известно, предоставляют способ специализации поведения класса без его подклассификации.

Некоторые классы имеют сложное общее поведение, но все же предназначены для специализированных. Подумайте о классе Window в графическом интерфейсе: окно может использовать много, но вы, скорее всего, все же хотите каким-то образом его специализировать. В некоторых рамках это делается через наследование. Другой способ сделать это - с делегатами. Предположим, что вы хотите, чтобы что-то произошло, когда окно изменилось: ваш класс делегата может затем реализовать метод, называемый onWindowResize (при условии, конечно, что класс Window поддерживает это), который вызывается всякий раз, когда изменяется окно и отвечает за любое специализированное поведение, когда окно изменение размера.

Я не буду спорить о преимуществах делегирования над наследованием, но достаточно сказать, что многие считают, что делегирование "более чистое", чем наследование.