У меня есть путаница в отношении 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 будут по умолчанию автоматически создавать события "Добавить" и "Удалить" , которые будут вести себя так, как указано выше.