正确命名C#事件和处理程序

bpl*_*lus 21 c# events naming-conventions

从我读过的内容来看,我不确定我是否有事件和处理程序的命名约定.(似乎有一些相互矛盾的建议).

在下面的两个类中,任何人都可以告诉我,如果我有事件的命名权,引发事件的方法和处理事件的方法?

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()); 
  }
 }
}
Run Code Online (Sandbox Code Playgroud)

和订户类:

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
 }
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

MaL*_*Lio 22

几乎

触发事件的方法 - On<When>Event (来自RaiseSomethingHasHappened)

OnBeforeOpen,OnClosing,OnSomethigHasHappened

活动<When>Event (来自OnSomethingHasHappened)

BeforeOpen,Closing,SomethingHasHappened

处理程序<The Instance or meaningful Name><_><Event>(来自Car_SomethingHasHappened)

Form_BeforeOpen,Window_Closing,Car_SomethingHasHappened- >完美

  • +1 但是,在某些 MS 示例中,私有事件触发方法是 NotifyEventName(例如 NotifyProperyChanged)。 (2认同)

Dr *_*bie 7

嗯,第一点是你定义了自己的命名约定,没有'错误'的方法(只要它是一致的).

话虽如此,如果您与其他人共享代码,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()); 
  }
 }
}
Run Code Online (Sandbox Code Playgroud)

需要注意的是该事件的标题是没有"开"的前缀,而事件触发方法命名为"开"的前缀.事件触发方法也是protected virtual这样的,派生类可以覆盖以更改/添加行为,并在需要时使用它来自行触发事件.


Ada*_*rth 5

我倾向于做相反的事情:

public event EventHandler SomethingHappened;

private void OnSomethingHappened()
{
    SomethingHappened();
}
Run Code Online (Sandbox Code Playgroud)

然后:

private void Car_SomethingHappened()
{

}
Run Code Online (Sandbox Code Playgroud)

不是最干净的代码,但命名是我如何做到的.如果没有明确的局部变量名称或没有意义,我将名称后缀为"Handler":

private void SomethingHappenedHandler() {}
Run Code Online (Sandbox Code Playgroud)


Pie*_*uys 3

我个人研究了微软如何命名他们的事件以及他们如何命名他们的处理程序。

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
   }
}
Run Code Online (Sandbox Code Playgroud)