从我读过的内容来看,我不确定我是否有事件和处理程序的命名约定。 (似乎有一些相互矛盾的建议)。
在下面的两个类中,任何人都可以告诉我,如果我有事件的命名权限,引发事件的方法和处理事件的方法吗?
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
}
}
提前致谢!
答案 0 :(得分: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
- &gt;完美
答案 1 :(得分:6)
嗯,第一点是您定义了自己的命名约定,并且没有“错误”的方法(只要它是一致的)。
话虽如此,如果您与其他人分享您的代码,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
,因此派生类可以覆盖以更改/添加行为,并在需要时使用它自行触发事件。
答案 2 :(得分:5)
我倾向于做相反的事情:
public event EventHandler SomethingHappened;
private void OnSomethingHappened()
{
SomethingHappened();
}
然后:
private void Car_SomethingHappened()
{
}
不是最干净的代码,但命名是我如何做到的。如果没有明确的局部变量名称或没有意义,我将名称后缀为“Handler”:
private void SomethingHappenedHandler() {}
答案 3 :(得分:1)
我个人看看微软如何命名他们的事件以及他们如何命名他们的处理程序。
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
}
}
答案 4 :(得分:1)
我会说命名惯例是可以的,但我想念你的例子发生了什么事?
所以我会更加专注于事件本身的名称(如MovedForward
),或者如果你需要它更通用,你应该在EventArgs中提供一些关于改变了什么的附加信息(比如ListChanged
在BindingList
)。