【问题标题】:Naming, declaring and defining delegates and events conventions [closed]命名、声明和定义代表和事件约定[关闭]
【发布时间】:2009-03-25 17:32:28
【问题描述】:

如何命名委托、事件和事件实例?

我用这个:

delegate void OnSomethingHandler();
event OnSomethingHandler onSomething;

这是一种公认​​的方式吗?注意大小写


您在哪里放置代表和事件?

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

mynamespace.Def.SomethingLike
{

}
mynamespace.Def.SomethingElseLike
{

}

您在哪里定义事件?

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

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

【问题讨论】:

    标签: c# .net coding-style


    【解决方案1】:

    MSDN on naming events:

    事件总是指一些动作,要么是正在发生的,要么是已经发生的。因此,与方法一样,事件以动词命名,动词时态用于表示事件发生的时间。

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

    示例包括ClickedPaintingDroppedDown 等。

    一定要使用现在时和过去时,给事件命名之前和之后的概念。

    例如,在窗口关闭之前引发的关闭事件将被称为Closing,在窗口关闭后引发的事件将被称为Closed

    X 请勿使用“Before”或“After”前缀或后缀来表示前后事件。使用刚才描述的现在时和过去时。

    DO 使用“EventHandler”后缀命名事件处理程序(用作事件类型的委托),如下例所示:

    public delegate void ClickedEventHandler(object sender, ClickedEventArgs e);
    

    DO 在事件处理程序中使用名为 sendere 的两个参数。

    sender 参数表示引发事件的对象。 sender 参数通常是 object 类型,即使可以使用更具体的类型。

    使用“EventArgs”后缀命名事件参数类。

    所以,事件应该用动词或动词短语命名。而不是OnSomething,使用Something,假设Something实际上是一个动词,如CloseClickManagedPiplelineAbandoningManagedPiplelineAbandoned

    事件的代表应该以EventHandler 后缀命名,例如CloseEventHandlerClickEventHandlerManagedPiplelineAbandoningHandler 等。

    对于与事件无关的委托,请使用名词,例如 EventProcessorItemRetriever,而该委托的实例是动词,例如 processEventretrieveItem

    您的委托引用的大小写应该是驼峰式,除非该引用不是私有的。不过,我想不出你会有一个非私有委托字段的情况。

    但是,由于建议使用传统的事件处理程序签名(即object sender, EventArgs e)),您应该use a generic event handler 而不是自己定义。也就是说,您的事件将被定义为:

    event EventHandler<SomethingEventArgs> Something;
    

    【讨论】:

      【解决方案2】:

      您所拥有的一切看起来都很标准 - 我唯一要更改的是事件名称将是 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();
      }
      

      【讨论】:

      • 我会考虑将 SomethingEventArgs 包含到您的示例中,因为这是约定的一部分。此外,EventHandler 在 2.0 后更常见
      【解决方案3】:

      扩展 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();
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-23
        • 2010-09-05
        • 1970-01-01
        相关资源
        最近更新 更多