我用这个:
delegate void OnSomethingHandler();
event OnSomethingHandler onSomething;
这是一种可接受的方式吗?注意小写和大写
我通常将代理放在最能反映它们的命名空间中:
mynamespace.Def.SomethingLike
{
}
mynamespace.Def.SomethingElseLike
{
}
我通常将它们放入使用它们的类中。
我注意到很多人在同一个类中定义委托和事件。这有多常见?
答案 0 :(得分:21)
事件总是指某个动作,无论是正在发生的动作还是已经发生的动作。因此,与方法一样,事件以动词命名,动词时态用于指示事件引发的时间。
√ DO 使用动词或动词短语命名事件。
示例包括
Clicked
,Painting
,DroppedDown
等。√ DO 使用当前和过去的时态为事件名称提供前后概念。
例如,在关闭窗口之前引发的close事件将被称为
Closing
,而在窗口关闭之后引发的事件将被称为Closed
。X 不要使用“之前”或“之后”前缀或后缀来指示事件前后。使用刚刚描述的现在和过去时态。
√ DO 使用“EventHandler”后缀命名事件处理程序(用作事件类型的委托),如以下示例所示:
public delegate void ClickedEventHandler(object sender, ClickedEventArgs e);
√ DO 在事件处理程序中使用名为 sender 和 e 的两个参数。
sender参数表示引发事件的对象。 sender参数通常是
object
类型,即使可以使用更具体的类型。√ DO 使用“EventArgs”后缀命名事件参数类。
因此,事件应该用动词或动词短语命名。假设OnSomething
实际上是动词,而不是Something
,而不是Something
,例如Close
,Click
或ManagedPiplelineAbandoning
和{{1} }}
事件的委托应使用ManagedPiplelineAbandoned
后缀命名,提供EventHandler
,CloseEventHandler
,ClickEventHandler
等。
对于与事件无关的代理,请使用名词,如ManagedPiplelineAbandoningHandler
或EventProcessor
,而该代理的实例是动词,如ItemRetriever
或{{ 1}}。
您的委托引用的大小写应该是camel,除非引用不是私有的。不过,我想不出你有非私人代表字段的情况。
但是,由于建议使用传统的事件处理程序签名(即processEvent
),因此您应use a generic event handler而不是定义自己的事件处理程序签名。也就是说,您的事件将被定义为:
retrieveItem
答案 1 :(得分:15)
你拥有的一切看起来都很标准 - 我唯一要改变的是事件名称是Something
而不是onSomething
。按照微软的惯例,你最终会得到更像这样的东西:
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();
}
答案 2 :(得分:0)
扩展bdukes的答案/摘要并使用我找到here的例子,这是我的尝试:
//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();
}
}
}