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

时间:2009-04-11 13:20:52

标签: c#

你会这样做:

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 个答案:

答案 0 :(得分:2)

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

AFAIK无法保证方法执行顺序,如果方法确实按顺序进行,则第一种方法更有意义。

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

答案 1 :(得分:0)

我也是第一个......

在2个例子中,性能应该非常接近,但#1更容易阅读imho - 但是,它取决于他们在做什么。我更喜欢这个例子:

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

..我希望你抓住我的漂移:P

如果您可以将2个事件处理程序绑定到1个通用程序(从域视角说话),我会这样做。如果处理程序完全不相关,我会将它们保存在不同的处理程序中。

答案是非常主观的imho。没有人能够提供“最终答案,案件结案”-kinda答案。

答案 2 :(得分:0)

我会使用第一个,只是因为它是传统的做法,对其他开发者来说更​​清楚。事件处理程序杂耍很难在任何情况下追踪,所以尽可能给每个人提供帮助。

答案 3 :(得分:0)

取决于

如果以下所有(或大多数)都为真,我会使用第二个选项:

  • DoFunc1和DoFunc2在功能方面完全独立。
  • 电话会议顺序无关紧要(即使是例外情况等)。
  • DoFunc1和DoFunc2在接收标准事件参数时没有签名问题。
  • DoFunc1和DoFunc2在设计环境中不是原始函数。
  • 源代码的不同区域可能决定需要多少订阅者。
  • DoFunc1和DoFunc2是需要解耦的其他类的一部分。
  • 我想在订阅或取消订阅DoFunc1和DoFunc2时进行自定义处理。

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

答案 4 :(得分:0)

啊,现在我明白了。这是关于Multicast Delegates的问题。根据文件......

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

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

如果你喜欢语法,你可以做到这两点,但是想要两个调用的功能抽象......

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

答案 5 :(得分:0)

出于单一(主观)原因,我更喜欢第一种选择。

这更具描述性,后来人们更容易理解。如果事件是人们以后需要取消订阅的事件,那么这一点就变得非常重要 - 有一个需要取消订阅的事件更有可能被未来的其他人正确处理,而不是2个事件。

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