Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
前缀是否为;关于;以C#方法的名义意味着什么?_C#_Events_Methods_Keyword - Fatal编程技术网

前缀是否为;关于;以C#方法的名义意味着什么?

前缀是否为;关于;以C#方法的名义意味着什么?,c#,events,methods,keyword,C#,Events,Methods,Keyword,有人能帮我解决这个困惑吗?我在C#示例、第三方软件中看到的方法,特别是以前缀“On”开头的处理事件的方法,是否有特殊含义 换句话说,这是一种语言惯例吗?推荐信?还是关键词 谢谢你的帮助 按照惯例,用于触发事件的方法将以“On”作为前缀,即OnSomeEvent调用时,将触发SomeEvent事件。没有任何关键字或其他语言结构会强制使用“On”前缀;这只是一个惯例 当需要允许从类定义外部显式触发事件(通常从继承类触发事件,因此这些方法通常受保护时,通常也会使用创建这样的方法。如果类的设计使得事件只

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

换句话说,这是一种语言惯例吗?推荐信?还是关键词

谢谢你的帮助

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

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

根据评论:

多谢各位。你知道你添加的内容上有什么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


(提示…滚动条在…
范围内持续很长时间)

这通常是一个事件。@jeroenvanevel它是一个触发事件的方法。按照惯例,事件本身没有前缀“On”。重要的是,在许多情况下,重写方法而不是订阅事件更有意义。特别是当其他类从您的类派生时。事件处理程序始终是看到事件的最后一段代码。你很可能想在活动开始前做点什么。或者根本不提。两者都需要重写该方法。为了完整性,按照惯例,这也是在子类中拦截事件的扩展点,而不是订阅同一实例上的事件,按照同样的惯例,它通常是(但不总是)
virtual
以便派生类型可以
重写它。@Senvy:换句话说,它是委托实例的名称吗?或者事件处理程序。对吗?@user1298925不,它将是事件的名称,而不是表示其类型的委托
public event Action WokenUp
通常会有一个
OnWokenUp
方法,而不是与之配套的
OnAction
方法。@Marc Gravell:谢谢。你知道你添加的内容上有什么URL吗。我需要更多的澄清来理解它。@Senvy:谢谢,你能给我举个例子吗?也许是在互联网上,或者如果你手边有一个例子的话?谢谢你的回复。很有见地。