C# 命名、声明和定义委托和事件约定 如何命名委托、事件和事件实例?
我用这个:C# 命名、声明和定义委托和事件约定 如何命名委托、事件和事件实例?,c#,.net,coding-style,C#,.net,Coding Style,我用这个: delegate void OnSomethingHandler(); event OnSomethingHandler onSomething; 这是公认的方式吗?注意小写和大写 您将代表和活动放置在何处? 我通常将委托放在一个名称空间中,以最好地反映它们: mynamespace.Def.SomethingLike { } mynamespace.Def.SomethingElseLike { } 你在哪里定义事件? 我通常把它们放在使用它们的班级里 我注意到很多人在
delegate void OnSomethingHandler();
event OnSomethingHandler onSomething;
这是公认的方式吗?注意小写和大写
您将代表和活动放置在何处? 我通常将委托放在一个名称空间中,以最好地反映它们:
mynamespace.Def.SomethingLike
{
}
mynamespace.Def.SomethingElseLike
{
}
你在哪里定义事件? 我通常把它们放在使用它们的班级里 我注意到很多人在同一个类中定义委托和事件。这有多普遍?: 事件总是指一些动作,要么是正在发生的动作,要么是已经发生的动作。因此,与方法一样,事件用动词命名,动词时态用于指示事件发生的时间 √ DO用动词或动词短语命名事件 示例包括单击的
,绘制的,下拉的,等等
√ DO使用现在时态和过去时态,给事件命名时使用before和after的概念
例如,在窗口关闭之前引发的关闭事件将被称为关闭
,而在窗口关闭之后引发的关闭事件将被称为关闭
X不要使用“Before”或“After”前缀或后缀来表示事件前后。使用刚才描述的现在时态和过去时态
√ DO使用“EventHandler”后缀命名事件处理程序(用作事件类型的委托),如下例所示:
public delegate void ClickedEventHandler(object sender, ClickedEventArgs e);
√ DO在事件处理程序中使用两个名为sender和e的参数
sender参数表示引发事件的对象。发送方参数的类型通常为object
,即使可以使用更具体的类型
√ DO使用“EventArgs”后缀命名事件参数类
因此,事件应该用动词或动词短语命名。使用Something
,而不是Something
,假设Something
实际上是一个动词,比如Close
,单击,或者managedpipleline放弃和managedpipleline放弃
事件的委托应使用EventHandler
后缀命名,并给出CloseEventHandler
、ClickEventHandler
、managedpiplelineauditinghandler
等
对于与事件无关的委托,请使用名词,如EventProcessor
或ItemRetriever
,而该委托的实例是动词,如processEvent
或retrieveItem
代理引用的大小写应该是驼峰,除非引用不是私有的。不过,我想不出哪种情况会有非私有的委托字段
但是,由于建议使用传统的事件处理程序签名(即对象发送方,EventArgs e)
),因此您应该使用它,而不是定义自己的签名。也就是说,您的事件定义如下:
event EventHandler<SomethingEventArgs> Something;
delegate void SomethingHandler();
event SomethingHandler Something;
protected void OnSomething()
{
if (this.Something != null)
this.Something();
}
事件事件处理程序;
您拥有的一切看起来都很标准-我唯一要更改的是,事件名称将是某物
,而不是某物
。按照微软的惯例,你最终会得到类似的结果:
event EventHandler<SomethingEventArgs> Something;
delegate void SomethingHandler();
event SomethingHandler Something;
protected void OnSomething()
{
if (this.Something != null)
this.Something();
}
作为一个很酷的技巧,您可以将一个空委托添加到Something
事件中,这样您就不必在引发事件之前检查事件是否为null:
delegate void SomethingHandler();
event SomethingHandler Something = delegate {};
protected void OnSomething()
{
this.Something();
}
在bdukes答案/总结的基础上展开,并使用我找到的一个示例,以下是我的尝试:
//from http://www.codeproject.com/Articles/11541/The-Simplest-C-Events-Example-Imaginable
using System;
namespace wildert
{
public class TimeOfTickEventArgs : EventArgs //<- custom event args
{
private DateTime TimeNow;
public DateTime Time
{
set { TimeNow = value; }
get { return this.TimeNow; }
}
}
public class Metronome
{
public delegate void TickEventHandler(object sender, TimeOfTickEventArgs e); //I put the delegate declaration before the events
public event TickEventHandler Ticked; //Ticked(i.e. after something occurred), or possibly Ticking(i.e. before)
public void Start()
{
while (true)
{
System.Threading.Thread.Sleep(3000);
if (Ticked != null){
TimeOfTickEventArgs tot = new TimeOfTickEventArgs();
tot.Time = DateTime.Now;
Ticked(this, tot); //<- publish the event
}
}
}
}
public class Listener
{
public void Subscribe(Metronome m){
m.Ticked += new Metronome.TickEventHandler(HeardIt); //<- subscribe to the event
}
private void HeardIt(object sender, TimeOfTickEventArgs e){ //<- this is the event handler (note signature 'object sender, xxx e')
System.Console.WriteLine("HEARD IT AT {0}",e.Time);
}
}
class Test
{
static void Main()
{
Metronome m = new Metronome();
Listener l = new Listener();
l.Subscribe(m);
m.Start();
}
}
}
//来自http://www.codeproject.com/Articles/11541/The-Simplest-C-Events-Example-Imaginable
使用制度;
命名空间wildert
{
PrimeTimeTimeTimeEngsGs:EngestGs//我会考虑将一些事件EngAsgGS加入到您的样本中,因为这是公约的一部分。此外,EventHandler更常见于POST 2之后。