【问题标题】:Naming C# events and handlers properly [closed]正确命名 C# 事件和处理程序 [关闭]
【发布时间】:2010-07-23 09:54:31
【问题描述】:

根据我的阅读,我不确定事件和处理程序的命名约定是否正确。 (那里似乎有一些相互矛盾的建议)。

在下面的两个类中,谁能告诉我我是否拥有事件的命名权、引发事件的方法和处理事件的方法?

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
 }
}

提前致谢!

【问题讨论】:

  • 我投票结束这个问题,因为它是关于代码审查而不是可重现的编程问题。
  • @Cᴏʀʏ 这个问题,正如它目前所写的那样,对于Code Review 来说是题外话。诸如“SomethingHappened”之类的占位符使其过于假设,无法查看。
  • @Cᴏʀʏ 2010 年的一个问题在Code Review 甚至是一个网站提案之前就被问到了。超过 60 天 (IIRC) 的问题不能(不应该反正)被迁移。
  • 当然是可重现的。 ObjectName_EventName 是 Visual Studio 自动生成的命名约定,但它违反了 Visual Studio 的命名约定,即如果对象的名称不大写,则所有函数都大写。

标签: c# events naming-conventions


【解决方案1】:

差不多

触发事件的方法 - On&lt;When&gt;Event(来自RaiseSomethingHasHappened

OnBeforeOpenOnClosingOnSomethigHasHappened

事件&lt;When&gt;Event(来自OnSomethingHasHappened

BeforeOpenClosingSomethingHasHappened

处理程序&lt;The Instance or meaningful Name&gt;&lt;_&gt;&lt;Event&gt;(来自Car_SomethingHasHappened

Form_BeforeOpen, Window_Closing, Car_SomethingHasHappened -> 完美

【讨论】:

  • +1 但是,在某些 MS 示例中,私有事件触发方法是 NotifyEventName(例如 NotifyProperyChanged)。
【解决方案2】:

嗯,第一点是您定义自己的命名约定,并且没有“错误”的方式来做到这一点(只要它是一致的)。

话虽如此,如果您与其他人共享您的代码,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,因此派生类可以重写以更改/添加行为,并在需要时使用它自己触发事件。

【讨论】:

    【解决方案3】:

    我倾向于做相反的事情:

    public event EventHandler SomethingHappened;
    
    private void OnSomethingHappened()
    {
        SomethingHappened();
    }
    

    然后:

    private void Car_SomethingHappened()
    {
    
    }
    

    不是最干净的代码,但命名是我的做法。如果没有明确的局部变量名或没有意义,我在名称后加“Handler”:

    private void SomethingHappenedHandler() {}
    

    【讨论】:

      【解决方案4】:

      我个人看看微软如何命名他们的事件以及他们如何命名他们的处理程序。

      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
         }
      }
      

      【讨论】:

        【解决方案5】:

        我会说命名约定没问题,但我在你的例子中错过了什么发生了什么?

        所以我会更专门化事件本身的名称(例如MovedForward),或者如果您需要更通用的名称,您应该在 EventArgs 中提供一些有关已更改内容的附加信息(例如 BindingList 中的 ListChanged )。

        【讨论】:

          猜你喜欢
          • 2012-11-25
          • 2012-04-20
          • 1970-01-01
          • 1970-01-01
          • 2010-11-26
          • 2013-06-16
          • 1970-01-01
          • 2011-12-28
          • 2021-11-18
          相关资源
          最近更新 更多