Именование событий и обработчиков С#
Из того, что я прочитал, я не уверен, что у меня есть соглашение об именах для событий и обработчиков. (там, похоже, есть некоторые противоречивые советы).
В двух нижеприведенных ниже классах кто-нибудь скажет мне, имеет ли я название для события, метод, который вызывает событие и метод, который обрабатывает событие?
public class Car
{
// is event named correctly?
public event EventHandler<EventArgs> OnSomethingHasHappened;
private void MoveForward()
{
RaiseSomethingHasHappened();
}
// is the named correctly
private void RaiseSomethingHasHappened()
{
if(OnSomethingHasHappened != null)
{
OnSomethingHasHappened(this, new EventArgs());
}
}
}
и класс подписчика:
public class Subscriber()
{
public Subscriber()
{
Car car = new Car();
car.OnSomethingHasHappened += Car_SomethingHasHappened();
}
// is this named correctly?
private void Car_SomethingHasHappened(object sender, EventArgs e)
{
// do stuff
}
}
Спасибо заранее!
Ответы
Ответ 1
Почти
Способ запуска события - On<When>Event
(из RaiseSomethingHasHappened
)
то есть. OnBeforeOpen
, OnClosing
, OnSomethigHasHappened
Событие <When>Event
(from OnSomethingHasHappened
)
то есть. BeforeOpen
, Closing
, SomethingHasHappened
обработчик <The Instance or meaningful Name><_><Event>
(из Car_SomethingHasHappened
)
то есть. Form_BeforeOpen
, Window_Closing
, Car_SomethingHasHappened
→ perfect
Ответ 2
Ну, первый момент заключается в том, что вы определяете свое собственное соглашение об именах, и не существует "неправильного" способа его выполнения (если он согласован).
Сказав это, стандарты Microsoft хороши, если вы делитесь своим кодом с другими.
Обычно имена событий будут иметь вид:
public class Car
{
// is event named correctly?
public event EventHandler<EventArgs> SomethingHasHappened;
private void MoveForward()
{
OnSomethingHasHappened();
}
// is the named correctly
protected virtual void OnSomethingHasHappened()
{
EventHandler<EventArgs> locum = SomethingHasHappened;
if(locum!= null)
{
locum(this, new EventArgs());
}
}
}
Обратите внимание, что это событие называется без префикса 'On', а метод запуска события имеет имя с префиксом 'On'.
Метод запуска событий также protected virtual
, поэтому производные классы могут переопределять, чтобы изменять/добавлять поведение, а также использовать его для запуска самого события, когда это требуется.
Ответ 3
Я имею тенденцию делать обратное:
public event EventHandler SomethingHappened;
private void OnSomethingHappened()
{
SomethingHappened();
}
Тогда:
private void Car_SomethingHappened()
{
}
Не самый чистый код, но именование - это то, как я это делаю. Если нет явного имени локальной переменной или это не имеет смысла, я суффикс имени с помощью "Обработчик":
private void SomethingHappenedHandler() {}
Ответ 4
Я лично смотрю, как Microsoft назвала свои события и как они называют их обработчики.
class Form{
public event EventHandler<EventArgs> MouseMove;
public virtual void OnMouseMove()
{
if(MouseMove != null)
{
MouseMove(this, new EventArgs());
}
}
}
class Application{
public Application()
{
Form form = new Form();
form.MouseMove += //Hook your own Method
}
}
Ответ 5
Я бы сказал, что соглашение об именах в порядке, но что я пропустил в вашем примере ЧТО произошло?
Итак, я бы более специализировал имя самого события (например, MovedForward
), или если вам нужно его более обобщенно, вы должны предоставить некоторую дополнительную информацию в EventArgs о том, что изменилось (например, ListChanged
в BindingList
).