C# 一次关闭与形式关闭或一次加载与形式加载之间的差异

C# 一次关闭与形式关闭或一次加载与形式加载之间的差异,c#,winforms,C#,Winforms,我在VSTO中有一个表单addin。它有两种方法,onclose和Form_Closing 这两者有什么区别 我似乎无法从任何一份文件中找到答案 OnLoad和Form_-Load也是如此 谢谢 编辑:评论说OnClosing现在是OnFormClosing。如果是这样的话,什么是OnFormLoad?考虑到我必须注册这些活动,它的名字真的很重要吗 例如,我也有OnResize,是否调用了这些方法中的任何一个?我的意思是我从未在任何地方注册过。就像我做的Form_Load和Form_XXX函数一

我在VSTO中有一个表单addin。它有两种方法,onclose和Form_Closing

这两者有什么区别

我似乎无法从任何一份文件中找到答案

OnLoad和Form_-Load也是如此

谢谢

编辑:评论说OnClosing现在是OnFormClosing。如果是这样的话,什么是OnFormLoad?考虑到我必须注册这些活动,它的名字真的很重要吗

例如,我也有OnResize,是否调用了这些方法中的任何一个?我的意思是我从未在任何地方注册过。就像我做的Form_Load和Form_XXX函数一样。

这是

每个事件
Foo
都有相应的受保护方法
OnFoo
。该方法负责触发事件。(默认情况下,设计器将创建名为
ctrl\u Foo
的事件处理程序)

这意味着大部分时间都应该使用事件注册,但有时可能需要覆盖
OnFoo
实现。只有在需要时才这样做


项目同时执行这两个操作的事实可能表明存在编码错误。

因此,这一切都是因为除了定义事件的类之外,您无法在任何类中调用事件

例如,以这个类
Foo
&派生类型
FooChild

public class Foo
{
    public event EventHandler Bar;
}

public class FooChild : Foo
{
    public void SomeMethod(object sender, EventArgs e)
    {
        var bar = this.Bar;
        if (bar != null)
        {
            bar(sender, e);
        }
    }
}
编译此文件时,我得到错误:

事件“Foo.Bar”只能出现在+=或-=的左侧(从类型“Foo”中使用时除外)

那么,我如何从一个子类引发事件呢

我们在
Foo
中添加了一个
OnBar
方法

public class Foo
{
    public event EventHandler Bar;

    protected virtual void OnBar(object sender, EventArgs e)
    {
        var bar = this.Bar;
        if (bar != null)
        {
            bar(sender, e);
        }
    }
}
现在,在
FooChild
中,我似乎可以通过两种方式访问事件:

public class FooChild : Foo
{
    /* FIRST WAY */
    public FooChild()
    {
        this.Bar += BarHandler;
    }

    private void BarHandler(object sender, EventArgs e)
    {
        /* Do Stuff */
    }

    /* SECOND WAY */
    protected override void OnBar(object sender, EventArgs e)
    {
        base.OnBar(sender, e);
        /* Do Stuff */
    }
}
第一种方法是任何代码都可以附加到
Foo
上的事件。它的语义是“事件已被触发,我正在响应它”

第二种方式略有不同。如果按上述方式实施,则其有效性与正常处理方法相同。但它可以做一些更强大的事情。它的语义是“类层次结构中的
Foo
中的一些代码要求事件应该被触发,但如果将被触发,我将做出最终决定。”下面是一些可以做到这一点的代码:

public class FooChild : Foo
{
    protected bool _suppressBarEvent = true;

    protected override void OnBar(object sender, EventArgs e)
    {
        if (!_suppressBarEvent)
        {
            base.OnBar(sender, e);
        }
    }
}
因此,在本例中,我们已经覆盖了
Bar
事件是否将被触发。这将影响已附加的所有事件处理程序


这就是####方法的真正目的。

有不同的方法可以完成不同的工作

OnLoad
是触发事件的方法


Form\u Load
是“event handler”,它是在事件被触发时执行的方法。

我的观点是,如果我从未注册它们,那么函数的名称就无关紧要了?onclose是一个受保护(接近私有)的方法。其中有一个。但是,可以向同一事件注册任意数量的事件处理程序(即不同的方法)。