正确命名C#事件和处理程序
从我读过的内容来看,我不确定我是否有事件和处理程序的命名约定。 (似乎有一些相互矛盾的建议)。
在下面的两个类中,任何人都可以告诉我,如果我有事件的命名权限,引发事件的方法和处理事件的方法?
public class Car { // is event named correctly? public event EventHandler 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 } }
提前致谢!
几乎
触发事件的方法 – On
(来自RaiseSomethingHasHappened
)
即OnBeforeOpen
, OnClosing
, OnSomethigHasHappened
事件
(来自OnSomethingHasHappened
)
即BeforeOpen
, Closing
, SomethingHasHappened
处理程序
(来自Car_SomethingHasHappened
)
即Form_BeforeOpen
, Window_Closing
, Car_SomethingHasHappened
– >完美
嗯,第一点是你定义了自己的命名约定,没有“错误”的方法(只要它是一致的)。
话虽如此,如果您与其他人共享代码,Microsoft标准会很好。
通常,您将事件名称设置为:
public class Car { // is event named correctly? public event EventHandler SomethingHasHappened; private void MoveForward() { OnSomethingHasHappened(); } // is the named correctly protected virtual void OnSomethingHasHappened() { EventHandler locum = SomethingHasHappened; if(locum!= null) { locum(this, new EventArgs()); } } }
请注意,事件的标题没有“On”前缀,事件触发方法以“On”前缀命名。 事件触发方法也protected virtual
以便派生类可以覆盖以更改/添加行为,并在需要时使用它来自行触发事件。
我倾向于做相反的事情:
public event EventHandler SomethingHappened; private void OnSomethingHappened() { SomethingHappened(); }
然后:
private void Car_SomethingHappened() { }
不是最干净的代码,但命名是我如何做到的。 如果没有明确的局部变量名称或没有意义,我用“Handler”后缀名称:
private void SomethingHappenedHandler() {}
我个人看看微软如何命名他们的事件以及他们如何命名他们的处理程序。
class Form{ public event EventHandler 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 } }
我会说命名惯例是可以的,但我想念你的例子发生了什么?
所以我会更专注于事件本身的名称(如MovedForward
),或者如果你需要它更通用,你应该在EventArgs中提供一些关于改变了什么的附加信息(比如BindingList
的ListChanged
)。