【问题标题】:Necessity of base calls on Overriden Form Event Methods重写表单事件方法的基本调用的必要性
【发布时间】:2011-12-07 21:34:00
【问题描述】:

当覆盖表单的事件方法时,到目前为止,我发现调用基方法和不调用它之间没有区别。

Q - 被覆盖的方法究竟做了什么?

提前致谢。

【问题讨论】:

    标签: c# .net winforms visual-studio-2010


    【解决方案1】:

    这些方法的 MSDN 文档对此毫不含糊。他们有一个“实现者须知”短语,要求您调用基本方法。大多数基本方法实现都非常干净,除了引发与该方法相关的事件之外什么也不做。因此,如果您覆盖 OnPaint,执行所有绘画而不调用 base.OnPaint(),则不会引发 Paint 事件。这工作得很好,但对于另一个想要使用 Paint 事件并且不知道为什么他的代码不起作用的程序员来说可能是一个令人不快的惊喜。

    虽然并非所有这些基本方法都那么简单,但它们有时会做一些额外的事情。像 OnFormClosing() 调用 ValidateChildren()。这可能很重要,或者您可能不小心不在乎。控制的复杂性是一个因素。一个很好的例子是 DataGridView,当你跳过基本调用时,它不太可能很好地工作。这种不当行为很难诊断。

    冒险这样做没有什么意义,你没有时间机器告诉你它不会造成麻烦。

    只有一个方面值得您关注,问题中没有其他问题。如果您首先调用基本方法,然后编写自定义。还是应该先自定义,然后调用基础方法?这就是这些方法存在的原因。由你决定谁是老板。

    【讨论】:

      【解决方案2】:

      除了具体的答案之外,我还想指出,即使您知道(可能通过反编译)该方法什么都不做,也始终调用您已覆盖的基本方法通常是一个好主意。原因:API 提供者将来可能会向该方法添加对类正常运行至关重要的代码。这可以通过错误修复或新版本来完成。您无法知道提供者是否会进行这些更改,以及何时/是否会进行更改,并且您的代码没有调用基本方法,您将遇到奇怪的问题,有时您的代码工作正常。

      我的规则是始终调用基方法,除非我有非常明确的理由必须完全覆盖该基方法的全部功能。

      【讨论】:

        【解决方案3】:

        基本方法本身引发事件。

        如果你不调用它们,任何正常的处理程序将永远不会运行。

        【讨论】:

        • 您到底指的是什么“普通处理程序”?
        • 将事件作为事件而不是覆盖来处理的任何东西 - 例如,您通过 Visual Studio 添加的应用程序中的其他代码,它创建事件处理程序来对表单事件做出反应而不是覆盖。跨度>
        • 但是没有默认和/或不可见的行为会因为不调用基本方法而被破坏或干扰?
        • @Acidic 确实,请参阅我更一般的答案 - 你不知道这是否会在未来的版本中改变。您应该将第 3 方 API 视为完全不透明的(好像您不知道内部发生了什么)。仅查看已发布的合同规定的内容。
        猜你喜欢
        • 2013-08-01
        • 1970-01-01
        • 2012-08-06
        • 2012-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-20
        • 1970-01-01
        相关资源
        最近更新 更多