7

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

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

谢谢你的帮助。

4

2 回答 2

15

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

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

于 2013-09-09T17:16:24.777 回答
10

根据评论:

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

于 2013-09-09T19:25:10.803 回答