C#方法名称中的前缀"On"是否意味着什么?

use*_*925 7 c# methods events keyword

任何人都可以帮助我解决这个困惑吗?我在C#示例中看到的方法是否有特殊含义,第三方软件,特别是处理事件的方法,以前缀"On"开头?

换句话说,这是一种语言惯例吗?推荐?还是KeyWord?

谢谢你的帮助.

Ser*_*rvy 10

这是惯例是存在触发事件将与"开",即作为前缀的方法OnSomeEvent被调用时,将触发SomeEvent事件.没有关键字或其他语言构造会强制使用"On"前缀; 它只是一个惯例.

当您需要允许从类定义外部显式触发事件时,通常也会使用创建此类方法(通常来自继承类,因此通常会使用这些方法protected).如果类的设计使得事件只是从定义它的类中触发,那么通常不会有任何"On"方法,这就是为什么在很多情况下你没有看到它的原因.

  • 为了完整性 - 这也是*convention*在子类中拦截事件的扩展点,而不是在同一个实例上订阅事件 - 通过这个相同的约定它*通常*(但不总是)`virtual`,这样派生类型可以"覆盖"它. (3认同)

Mar*_*ell 9

根据评论:

谢谢 .你碰巧知道你添加的内容的任何URL.我需要更多的澄清来解释它.

这只是为了解释; 作为一般情况的完整示例,这是已建立的约定 - 不是规则 - 存在强制执行此操作 - 它只是许多代码使用的常见模式:

public class SomeBaseClassWithAnEvent
{
    public event EventHandler SomeEvent;

    protected virtual void OnSomeEvent()
    {
        var handler = SomeEvent;
        if (handler != null) handler(this, EventArgs.Empty);
    }

    public void SomeOtherMethodThatHasSideEvents()
    {
        //...do stuff...
        OnSomeEvent();
        //...do more stuff...
    }
}

public class SomeSubclass : SomeBaseClassWithAnEvent
{
    protected override void OnSomeEvent()
    {
        // custom stuff here to do it before the event
        base.OnSomeEvent();
        // or here to do it after the event
    }
}
Run Code Online (Sandbox Code Playgroud)

这种模式允许两件事:

  • 子类可以通过调用On...方法来调用事件
  • 子类可通过拦截添加功能的情况下重写On...方法

如果你想看看这种模式是根深蒂固的 - 只需进入你正在使用的任何框架(winforms,wpf,asp.net,asp.net mvc,你能想到的任何其他东西)override,然后输入,然后向下滚动到On:

在此输入图像描述

(提示......滚动条在该范围内持续了一段时间On...)