【问题标题】:asp.net overrideasp.net 覆盖
【发布时间】:2011-10-15 08:04:24
【问题描述】:

使用标准事件处理程序或覆盖 asp.net 页面的基类有哪些优缺点?有吗?我见过两者曾经做同样的事情。

protected void Page_PreInit(object sender, EventArgs e)
{
    //Put your code here
}

protected override void OnPreInit(EventArgs e)
{
    base.OnPreInit(e);
    //Put your code here
}

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    如果您使用覆盖,您可以决定何时执行自定义函数。在基本方法之后或之前。但如果您使用自动连线事件,它将在基本事件之后执行。

    protected override void OnPreInit(EventArgs e)
    {
        base.OnPreInit(e);
        //Put your code here
    }
    

    protected override void OnPreInit(EventArgs e)
    {
        //Put your code here
        base.OnPreInit(e);
    }
    

    【讨论】:

    • 请记住,这与其说是专业人士,不如说是骗局。尽管此方法可以让您更好地控制代码执行,但它可以轻松创建时间耦合,使创建/修改页面的类层次结构更加困难,并增加复杂性。
    【解决方案2】:

    首先,两者不是一回事。

    OnLoad、OnInit 等是触发事件的方法。它的目标是封装事件触发,因此,如果这些是虚拟方法,派生类将能够覆盖它们并在触发某些事件之前和/或之后执行某些操作。

    我不会问proscons,而是“何时使用它们”,因为两者是不同的东西。

    何时使用事件触发方法

    • 某些操作必须在某个页面或控件生命周期之前或之后执行。
    • 某些生命周期步骤需要初始化某些内容,以便页面或控件订阅者按照定义在其正确状态下执行某些操作。
    • 授权:由于安全问题,这会阻止某些资源在生命周期中执行。
    • 添加一些自定义生命周期步骤,因此页面或控件需要通知一些订阅者。

    何时直接使用事件

    • 页面或控件本身,或关联到控件集合或只是一个观察者,需要在页面或控件处于某个生命周期步骤时执行某些操作。

    请注意,因为如果您倾向于覆盖事件触发方法,您就是在修改事件本身触发的方式,这是很关键的事情。

    如果您需要在某个页面或控件生命周期中执行某项操作,请订阅该事件,如果您需要订阅执行某项操作某个事件触发之前,实现一个新的事件并在下一个引发之前触发它

    public event EventHandler CustomEvent;
    
    protected virtual void OnCustomEvent(EventArgs e) 
    {
         if(CustomEvent != null) 
         {
             CustomEvent(this, e);
         }
    }
    
    protected override void OnPreRender(EventArgs e)
    {
         OnCustomEvent(new EventArgs());
         base.OnPreRender(e);
    }
    

    在我看来,重写触发事件的方式当情况是某些对象需要在发生某些事情时得到通知是对 C# 语言的错误使用,因为这是通过使用事件委托模型来实现的。

    【讨论】:

      【解决方案3】:

      There is much difference in both of the name that you have mentioned, I would like to tell you about that, actually overriding means to use the same method with the same name in the child class, but only the parameters are different in both of the methods,如果假设以计算面积为例,如果你想计算两到三个不同物体的面积,那么你必须取三个不同的名字而不是你可以为每个使用相同的名字,只是参数不同。

      【讨论】:

        【解决方案4】:

        如果 autoeventWireUp 为 On,将调用 Page_PreInit。

        函数 OnPreInit 是虚拟的,并且在您的页面中被覆盖。

        但是虚拟的主函数 - 正在执行触发 Page_PreInit 的代码。

        所以你必须调用 base.OnPreInit(e);即使你覆盖它。

        如果您需要在 OnPreInit 之前或之后放置一些代码,请使用第二个。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-14
          • 1970-01-01
          • 2010-12-07
          • 2011-02-11
          • 1970-01-01
          • 2023-03-24
          相关资源
          最近更新 更多