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

Именование событий и обработчиков С#

Из того, что я прочитал, я не уверен, что у меня есть соглашение об именах для событий и обработчиков. (там, похоже, есть некоторые противоречивые советы).

В двух нижеприведенных ниже классах кто-нибудь скажет мне, имеет ли я название для события, метод, который вызывает событие и метод, который обрабатывает событие?

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
 }
}

Спасибо заранее!

4b9b3361

Ответ 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).