代码之家  ›  专栏  ›  技术社区  ›  Hao Wooi Lim

一个通用事件名或多个描述性事件名

c#
  •  3
  • Hao Wooi Lim  · 技术社区  · 16 年前

    你会这样做:

    this.btSomeButton.Click += btSomeButton_OnClick;
    
    private void btSomeButton_OnClick(object sender, EventArgs e)
    {
        this.DoFunc1();
        this.DoFunc2();
    }
    

    或:

    this.btSomeButton.Click += DoFunc1;
    this.btSomeButton.Click += DoDunc2;
    

    使用第二种方法是否有任何隐藏的含义?比如,是否保证dofunc2()将在dofunc1()之后运行?

    6 回复  |  直到 16 年前
        1
  •  2
  •   Jon Limjap    16 年前

    我认为第一种方法更安全。

    afaik对于方法执行顺序没有保证,而且如果方法确实是按顺序来的,那么第一个方法无论如何都更有意义。

    此外,当多个事件处理程序附加到一个事件时,在分离单个事件处理程序时很容易遗漏其他事件。

        2
  •  0
  •   cwap    16 年前

    我也会先做……

    在这两个例子中,表演应该是非常接近的,但是1更容易理解imho-但是,这取决于他们在做什么。我更喜欢这个,例如:

    this.btSomeButton.Click += DoSomethingRelatedToDataPersistence;
    this.btSomeButton.Click += DoSomethingRelatedToTheDirectionTheMoonSpinsAroundTheEarth;
    

    …我希望你明白我的意思:p

    如果您可以将两个事件处理程序绑定到一个公共过程中(从域的角度进行讨论),我会这样做。如果处理程序完全不相关,我会将它们保存在不同的处理程序中。

    答案是非常主观的。没有人能够提供“最终答案,结案”——类似的答案。

        3
  •  0
  •   dkretz    16 年前

    我之所以使用第一个,是因为它是传统的实践,对其他开发人员来说更清楚。在任何情况下,事件处理程序的处理都很难跟踪,因此请尽可能多地为每个人提供帮助。

        4
  •  0
  •   isntn    16 年前

    视情况而定。

    如果下面所有(或大部分)都是真的,我将使用第二个选项:

    • 在功能上,dofunc1和dofunc2完全独立。
    • 调用顺序并不重要(即使在异常情况下)。
    • 在接收标准事件参数时,dofunc1和dofunc2没有签名问题。
    • 在设计环境中,dofunc1和dofunc2不是原始函数。
    • 源代码的不同区域可能决定需要多少订户。
    • dofunc1和dofunc2是需要解耦的其他类的一部分。
    • 我想在订阅或取消订阅dofunc1和dofunc2时进行自定义处理。

    如果订单很重要,第一个选项是必须的,因为它是明确的。我不知道C语言规范是否保证第二个选项中的顺序。

        5
  •  0
  •   Reed Copsey    16 年前

    我更喜欢第一种选择,因为一个单一的(主观的)原因。

    这更具描述性,以后其他人更容易理解。如果事件是人们稍后需要取消订阅的事件,那么这一点就变得很重要了——与2个事件相比,拥有一个需要取消订阅的单个事件更有可能被其他人正确处理。

    由于您询问了执行顺序,这表明这两个函数是相关的。这样做会迫使事件一起取消订阅,因此从func1()而不是func2()取消订阅是不可能的,如果您担心执行顺序(btw是有保证的),这可能非常关键。

        6
  •  0
  •   JP Alioto    16 年前

    啊,现在我明白了。这是一个关于 Multicast Delegates . 根据文件……

    多播委托具有委托的链接列表,称为调用列表,由一个或多个元素组成。当一个多播委托被调用时,调用列表中的委托按照它们出现的顺序被同步调用。

    但是,如果您关心调用的顺序,我不会依赖于此,我将使用下面的第一个方法或方法。

    如果您喜欢语法,您可以同时执行这两种操作,但需要两个调用的函数抽象…

    this.btSomeButton.Click += (sender, args)
    {
      this.doFunc1();
      this.doFunc2();
    };