对C#事件、委托、回调等进行分类

对C#事件、委托、回调等进行分类,c#,events,conventions,C#,Events,Conventions,我想,一个简单的问题是:如何在C#中对事件相关项进行分类/命名 例如,我当前的约定如下所示: public class A { ... #region Delegates public delegate void CallIncomingEventHandler(string displayName); #endregion #region Event Handlers public event CallIncoming; #endre

我想,一个简单的问题是:如何在C#中对事件相关项进行分类/命名

例如,我当前的约定如下所示:

public class A
{
    ...
    #region Delegates
    public delegate void CallIncomingEventHandler(string displayName);
    #endregion


    #region Event Handlers
    public event CallIncoming;
    #endregion
    ...
}

public class B
{
    ...
    #region Events
    private void A_CallIncoming(string displayName)
    {
        // do stuff here
    }
    #endregion
}
我的困惑在于用“delegate”修饰符定义“SomethingEventHandler”类型并将其称为“delegate”,然后用“event”修饰符定义类似字段的事件并将其称为“事件处理程序”,然后调用对事件作出反应的方法“events”

我的名字正确吗

我可以创建和使用自定义事件等,但是我可以在理解组件的名称以及其他人如何组织它们方面使用一些帮助


谢谢。

您描述了.NET中使用的约定,是吗

我个人认为你的方法没有问题。这是众所周知的,每一个与.NET合作的开发人员都很可能期望,如果不是相同的约定,那么就接近它。那么,既然存在一个被采纳的惯例,你为什么要发明一些新东西呢

与此相反,我建议您考虑如何在类中调用事件,以及将来如何扩展代理的参数?这里的一个很好的起点是再次遵循.NET约定,委托类似于
委托voidsomethingeventhandler(对象发送方,EventArgs e)
。本文对此给出了一个很好的想法


希望这能减少你的疑虑。

以防万一其他人/C#新手需要更具体的解释/示例:

公共类示例类
{
//DelegateNames=NameOfObject+动词+(“ed”或“ing”)+“Handler”。
//NameOfObject=数据、文件、属性、值、窗口、设置、用户,。。。
//动词=打开、关闭、格式化、清除、删除、创建、插入、更新、刷新、处置、排序,。。。
public委托void something happendhandler(对象pSender,对象pWhat);
公共委托void SomeValueChangedHandler(对象pSender、对象pWhat、对象pOldValue、对象pNewValue);
公共委托void something finishedhandler(对象pSender);
公共委托void somethingingInvokedHandler();
//EventNames=DelegateName-“处理程序”。
公共事件发生了一些事情,或者说发生了一些事情;
公共事件SomeValueChangedHandler SomeValueChanged;
公共事件一些事情结束了,一些事情结束了;
公共事件;事件;事件;事件;
//EventHandlingMethodNames=“On”+EventName。
出现在某个对象上的私有void(对象pSender,对象pWhat){/*代码…*/}
SomeValueChanged上的私有无效(对象pSender、对象pWhat、对象pOldValue、对象pNewValue){/*代码…*/}
已完成(对象pSender){/*代码…*/}
SomethingInvoked()上的私有无效({/*代码…*/}
//EventInvokingMethods=(“Fire”|“Notify”|“Invoke”)+EventName。
私有void FireSomeThingOccessed(对象pSender,对象pWhat){/*SomeThingOccessed?.Invoke(…);*/}
私有void NotifySomeValueChanged(对象pSender、对象pWhat、对象pOldValue、对象pNewValue){/*SomeValueChanged?.Invoke(…);*/}
私有void InvokeSomethingFinished(对象pSender){/*SomethingFinished?.Invoke(…);*/}
私有void NotifySomethingInvoked(){/*SomethingInvoked?.Invoke(…);*/}
}
对于C#中的其他程序元素,我使用(您可以)以下可选规则:

  • 始终使用与您的语言相同的字符大小写(大写或小写)
  • 始终遵循编程语言的命名约定/规则!(请参阅/分析/复制框架中的命名!)
  • 我使用前缀进行命名,当且仅当名称未违反规则0和1时
    • 例如:“p”+参数名称(用于更好地识别局部变量和参数
    • 或:“m”+MemberVariableName(用于更好地识别局部变量和成员变量
    • 或:“I”+接口名称(如:IDeserialize、IXmlConvert等)
    • 或:“A”+AbstracClassName(如:ADeserializer、AXmlConvert等)
    • 或:“E”+枚举名称(如:EState、EErrorCode、EMemberType等)
    • 或:“S”+静态变量名称
    • 和:所有上例适用于:
      • compiletime常量“public const double MY_const=-1.23
      • 运行时常量:“公共静态只读MyClass MY_CLASS=new MyClass()…”)

    我已经开始简单地按三种分类进行分组:public/protected/private、property/void method/non-void method/field/event,以及这些分类中的字母顺序。在特定情况下,我发现将与特定接口实现相关的所有方法分组到单独的文件classInterface.cs中很有用,但我很少使用它。我确实使用了区域,但仅用于非常大的类(我也试图避免)。这是框架中使用的命名约定。例如,
    FormClosing
    (事件)和
    FormClosingEventHandler
    (委托),以及
    FormClosingEventArgs
    (事件参数)。遵循此处的框架约定似乎是个好主意。