【问题标题】:Does the prefix "On" in the name of the C# methods imply anything?C# 方法名称中的前缀“On”是否意味着什么?
【发布时间】:2013-09-09 17:14:26
【问题描述】:

谁能帮我解决这个困惑?我在 C# 示例、第 3 方软件、特别是处理事件的方法中看到的以前缀“On”开头的方法有什么特殊含义吗?

换句话说,这是一种语言约定吗?推荐 ?或关键字?

感谢您的帮助。

【问题讨论】:

  • 这通常是一个事件。
  • @JeroenVannevel 这是一种触发事件的方法。按照惯例,事件本身不以“On”为前缀。
  • 重要的是,在很多情况下重写方法而不是订阅事件更有意义。特别是当其他类派生自您的类时。事件处理程序始终是看到事件的最后一段代码。您可能希望在引发事件之前 做一些事情。或者根本不提高它。两者都需要覆盖该方法。

标签: c# events methods keyword


【解决方案1】:

约定存在的用于触发事件的方法将以“On”为前缀,即OnSomeEvent,在调用时会触发SomeEvent 事件。没有关键字或其他语言结构会强制使用“On”前缀;这只是一个约定。

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

【讨论】:

  • 为了完整性 - 这也是 convention 在子类中拦截事件的扩展点,而不是在同一实例上订阅事件 - 按照相同的约定,它是经常(但不总是)virtual,以便派生类型可以override 它。
  • @Senvy :换句话说,它是委托实例的名称?或事件处理程序。对吧?
  • @user1298925 不,这将是事件的名称,而不是代表其类型的委托。 public event Action WokenUp 通常会有一个 OnWokenUp 方法,而不是与之配对的 OnAction 方法。
  • @Marc Gravell:谢谢。您是否碰巧知道您添加的任何 URL。我需要更多的说明才能理解它。
  • @Senvy:谢谢,你能给我看一个例子吗,也许是在互联网上,或者你有一个方便的例子吗?
【解决方案2】:

根据 cmets:

谢谢。您是否碰巧知道您添加的任何 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
    }
}

这种模式允许做两件事:

  • 子类可以通过调用On...方法来调用事件
  • 子类可以通过覆盖On...方法来拦截事件以添加功能

如果您想了解这种模式的根深蒂固 - 只需进入您正在使用的任何框架(winforms、wpf、asp.net、asp.net mvc,以及您能想到的任何其他框架),然后输入override ,然后向下滚动到On

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

【讨论】:

  • 感谢您的回复。非常有用。
猜你喜欢
  • 1970-01-01
  • 2017-05-10
  • 2013-04-11
  • 2011-06-28
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 2013-10-24
相关资源
最近更新 更多