命名,声明和定义委托和事件约定

时间:2009-03-25 17:32:28

标签: c# .net coding-style

您如何命名代表,事件和事件实例?

我用这个:

delegate void OnSomethingHandler();
event OnSomethingHandler onSomething;

这是一种可接受的方式吗?注意小写和大写


您在哪里放置代表和活动?

我通常将代理放在最能反映它们的命名空间中:

mynamespace.Def.SomethingLike
{

}
mynamespace.Def.SomethingElseLike
{

}

您在哪里定义事件?

我通常将它们放入使用它们的类中。

我注意到很多人在同一个类中定义委托和事件。这有多常见?

3 个答案:

答案 0 :(得分:21)

MSDN on naming events

  

事件总是指某个动作,无论是正在发生的动作还是已经发生的动作。因此,与方法一样,事件以动词命名,动词时态用于指示事件引发的时间。

     

DO 使用动词或动词短语命名事件。

     

示例包括ClickedPaintingDroppedDown等。

     

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,例如CloseClickManagedPiplelineAbandoning和{{1} }}

事件的委托应使用ManagedPiplelineAbandoned后缀命名,提供EventHandlerCloseEventHandlerClickEventHandler等。

对于与事件无关的代理,请使用名词,如ManagedPiplelineAbandoningHandlerEventProcessor,而该代理的实例是动词,如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();
        }
    }
}