Разница между событиями и методами - PullRequest
11 голосов
/ 03 февраля 2012

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

Ответы [ 4 ]

11 голосов
/ 03 февраля 2012

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

Что касается событий, предположим, у вас есть простой класс, в котором реализован счетчик (давайте назовем его объектом 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!");
     }
}
7 голосов
/ 03 февраля 2012

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

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

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

5 голосов
/ 03 февраля 2012

Событие в C # - это способ для класса предоставлять уведомления клиентам этого класса, когда с объектом происходит что-то интересное.*http://msdn.microsoft.com/en-us/library/aa645739%28v=vs.71%29.aspx

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

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

0 голосов
/ 04 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...