Разница между событиями и методами

У меня есть путаница в отношении Events. Каковы основные различия между событиями и методами С#?

Ответ 1

С# Events - это конкретная форма delegates. Если вы запрограммировали на других языках, например С++, вы можете сравнить указатель delegate с указателем функции ( "метод" ) - он указывает на некоторый код в памяти. Когда вы вызываете указатель как метод, вы фактически вызываете метод по адресу, на который указывает указатель.

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

P.S. delegates и Events, однако, имеют другие преимущества перед простыми указателями функций - вы можете быть уверены, что он укажет на красивый метод, используя правильное количество и тип аргументов и вернув правильный тип.

Ответ 2

Метод - это просто код, содержащийся внутри класса, для реализации части функциональности. Весь код в С# содержится в методах.

Что же касается событий, то предположим, что у вас был простой класс, который реализовал счетчик (позволяет называть его объектом Counter). Теперь предположим, что вы хотели, чтобы другие объекты, не связанные с Counter, знали, когда количество достигло 100. Как вы это сделаете?

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

Вот как работает работа - класс Counter содержит элемент события (называемый say, CounterIs100), к которому другие экземпляры объектов связывают один из своих методов. Когда объект Counter обнаруживает, что он достиг 100, он вызывает элемент CounterIs100, который автоматически вызывает все связанные с ним методы, тем самым, сообщая каждому объекту по очереди, что счет действительно достиг 100. Если ни один объект не связал метод с элементом события CounterIs100, он будет null, поэтому нет необходимости в том, чтобы объект Counter вызывал элемент события.

class Counter
{
   // this is the count field used to save the current count value
   private int count;

   // this is the event member which holds all the methods other objects have specified
   public event CounterIs100Delegate CounterIs100;

   // This is a method. It invokes the CounterIs100 event member if anyone has subscribed to it
   protected void OnCounterIs100()
   {
       // see if anyone has subscribed (linked) their method to this event
       if (CounterIs100 != null)
       {
          // invoke the event - this will call all subscribed methods
          CounterIs100();
       }
   }

   // This is a method. It increments the counter variable stored by this object
   public void Increment()
   {
      count++;
      // if the count is 100, invoke the event
      if (count == 100)
         OnCounterIs100();
   }

}

// This is a delegate. It is used to define a template for other objects wishing to
// subscribe to the CounterIs100 event. The methods other objects link to the
// CounterIs100 event must match this declaration (although the name can be changed)
public delegate void CounterIs100Delegate();

// This is a class, unrelated to Counter, but uses its events
class SiteHits
{
     Counter hitCounter = new Counter();

     public SiteHits()
     {
         // We want to know when the number of site hits reaches 100.
         // We could monitor this ourselves, but we know the Counter class already
         // does this, so we just link our method to its event
         hitCounter.CounterIs100 += this.WhenSiteHitsReaches100;
     }

     public void PageRequested()
     {
         // someone has requested a page - increment the hit counter
         Console.WriteLine("We've been hit!");
         hitCounter.Increment();            
     }

     // this is the method we want called when the CounterIs100 event occurs.
     // note that the return value and parameters match CounterIs100Delegate above.
     public void WhenSiteHitsReaches100()
     {
         Console.WriteLine("Woohoo! We've reached 100 hits!");
     }
}

Ответ 3

Событие в С# - это способ для класса предоставлять уведомления клиентам этого класса, когда с объектом возникает какая-то интересная вещь.

http://msdn.microsoft.com/en-us/library/aa645739%28v=vs.71%29.aspx

Метод - это кодовый блок, содержащий ряд операторов. В С# каждая выполненная команда выполняется так в контексте метода.

http://msdn.microsoft.com/en-us/library/ms173114%28v=vs.80%29.aspx

Ответ 4

Событие в .net - это пара методов, один для "Добавить" и один для "Удалить" , каждый из которых принимает делегата. Как правило, метод "Добавить" принимает переданный делегат и добавляет его либо в список делегатов, либо в MulticastDelegate; передача делегата в событие "Удалить" , которое ранее было передано методу "Добавить", должно удалить делегата из списка. Если кто-то не требует иного, оба С# и vb.net будут по умолчанию автоматически создавать события "Добавить" и "Удалить" , которые будут вести себя так, как указано выше.