【问题标题】:Categorizing C# Events, Delegates, Callbacks, etc对 C# 事件、委托、回调等进行分类
【发布时间】:2013-03-07 15:39:19
【问题描述】:

简单的问题,我认为:您如何在 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”类型并将它们称为“Delegates”,然后使用“event”修饰符定义类似字段的事件并将它们称为“事件处理程序”,然后调用对事件“Events”做出反应的方法。

我的命名正确吗?

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

谢谢。

【问题讨论】:

  • 我已经开始简单地按三个分类进行分组:公共/受保护/私有、属性/无效方法/非无效方法/字段/事件以及其中的字母顺序。在特定情况下,我发现将与特定接口实现相关的所有方法分组到一个名为 classInterface.cs 的单独文件中很有用,但我很少使用它。我确实使用区域,但仅用于非常大的类(我也试图避免)。
  • 这是框架中使用的命名约定。例如,FormClosing(事件)和FormClosingEventHandler(委托)和FormClosingEventArgs(事件参数)。在此处遵循框架约定似乎是个好主意。

标签: c# events conventions


【解决方案1】:

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

我个人认为你的方法没有问题。这是众所周知的,每个使用 .NET 的开发人员很可能会期望如果不是相同的约定,那么会接近它。那么,既然存在已采用的约定,为什么还要发明新的东西呢?

我建议您考虑一下如何在您的类中调用事件,以及您将来如何为委托扩展参数而不是这个?一个好的起点是再次遵循 .NET 约定,使用像 delegate void SomethingEventHandler(object sender, EventArgs e) 这样的代表。 this question 对此提出了很好的想法。

希望这能减少您的疑虑。

【讨论】:

    【解决方案2】:

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

    public class ExampleClass
    {
        // DelegateNames = NameOfObject + Verb + ("ed" or "ing") + "Handler".
        // NameOfObject  = Data, File, Property, Value, Window, Settings, User,...
        // Verb          = Open, Close, Format, Clear, Delete, Create, Insert, Update, Refresh, Dispose, Sort,...
        public delegate void SomethingHappenedHandler(object pSender, object pWhat);
        public delegate void SomeValueChangedHandler(object pSender, object pWhat, object pOldValue, object pNewValue);
        public delegate void SomethingFinishedHandler(object pSender);
        public delegate void SomethingInvokedHandler();
    
        // EventNames = DelegateName - "Handler".
        public event SomethingHappenedHandler SomethingHappened;
        public event SomeValueChangedHandler SomeValueChanged;
        public event SomethingFinishedHandler SomethingFinished;
        public event SomethingInvokedHandler SomethingInvoked;
    
        // EventHandlingMethodNames = "On" + EventName.
        private void OnSomethingHappened(object pSender, object pWhat) { /* Code...*/ }
        private void OnSomeValueChanged(object pSender, object pWhat, object pOldValue, object pNewValue) { /* Code...*/ }
        private void OnSomethingFinished(object pSender) { /* Code...*/ }
        private void OnSomethingInvoked() { /* Code...*/ }
    
        // EventInvokingMethods = ("Fire" | "Notify" | "Invoke") + EventName.
        private void FireSomethingHappened(object pSender, object pWhat) { /* SomethingHappened?.Invoke(...); */ }
        private void NotifySomeValueChanged(object pSender, object pWhat, object pOldValue, object pNewValue) { /* SomeValueChanged?.Invoke(...); */ }
        private void InvokeSomethingFinished(object pSender) { /* SomethingFinished?.Invoke(...); */ }
        private void NotifySomethingInvoked() { /* SomethingInvoked?.Invoke(...); */ }
    }
    

    对于 C# 中的其他程序元素,我使用(您可以)使用以下可选规则:

    1. 始终使用与您的语言相同的字符大小写(UpperCamelCase 或 lowerCamelCase)!
    2. 始终遵循编程语言的命名约定/规则! (请参阅/分析/复制框架中的命名!)
    3. 我使用前缀命名,当且仅当名称不违反规则 0 和 1,
    • like: "p" + ParameterName(为了更好地识别局部变量和参数
    • 或:“m”+ MemberVariableName(为了更好地识别局部变量和成员变量。
    • 或:“I”+ InterfaceName(例如:IDeserialize、IXmlConvert、...)
    • 或:“A”+AbstracClassName(如:ADeserializer、AXmlConvert、...)
    • 或:“E” + EnumerationName(如:EState、EErrorCode、EMemberType、...)
    • 或:“S”+StaticVarialeNames
    • 和:ALL_UPPER_CASE 用于:
      • 编译时常量“public const double MY_CONST = -1.23;”
      • 运行时常量:“public static readonly MyClass MY_CLASS = new MyClass()...”)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      相关资源
      最近更新 更多