代码之家  ›  专栏  ›  技术社区  ›  Sergio Tapia

在事件中编写方法体可以吗?

c#
  •  3
  • Sergio Tapia  · 技术社区  · 14 年前

    public void Button1_Click(blabla)
    {
       //His code was here.
    }
    

    调用一个方法来做脏活不是更好的编程实践吗?如果方法改变了,你只需要改变方法本身,而不需要改变事件(打破某物的可能性更小)

    public void Button1_Click(blabla)
    {
       DoSomething();
    }
    
    public void DoSomething()
    {
       //The actual code here.
    }
    
    9 回复  |  直到 14 年前
        1
  •  8
  •   ChrisF    14 年前

    你只需要提取 DoSomething 如果

    a) 它的功能是需要在其他地方,或者可能

        2
  •  4
  •   Jon Skeet    14 年前

    这样把它们分开是有一定意义的,如果你想打电话的话,这真的很有用 DoSomething 从其他地方(在这些地方提供发送者和事件参数是没有意义的)。

    然而,这里有一个更好的选择——至少如果你是以编程方式订阅的话。请改用匿名方法或lambda表达式:

    button.Click += delegate { DoSomething(); }
    

    这样做的缺点是它不能与visualstudio的设计器生成的事件订阅一起工作。就我个人而言,我希望VisualStudio支持使用不包含所有委托参数的方法订阅事件—它可以自动生成匿名方法(或lambda表达式)。我想,这将是两全其美。

    正如其他答案所说的,我认为如果不需要从其他地方调用方法体,那么将方法体保留在事件处理程序方法本身中是合理的。

        3
  •  1
  •   Justin Niessner    14 年前

    不,不一定。

    除非你要用 DoSomething() 在代码的其他地方…把它分解成一个单独的方法是毫无意义的。

    Button1\u Click本身已经是一个方法。它恰好是与click事件委托匹配的生成的头。你可以随便取这个名字,一切都会按照你想要的方式进行。

        4
  •  1
  •   Dan Bryant    14 年前

        5
  •  0
  •   anon anon    14 年前

    我个人认为这取决于代码的长度,以及代码是否在逻辑上位于那里。

    所以如果只有1或2行,我就在里面做,但是如果有更多的代码行,我就用一个单独的方法做。

        6
  •  0
  •   Joel Coehoorn    14 年前

    是的,额外的方法是“更好”,但你必须权衡与雅格尼(你不会需要它)反原则。

    有两个 额外的方法被认为更好:

    1. 它使重构该行为更容易在多个地方使用

    这两者都归结为封装和将行为与事件分离的思想。没有人会在稍后使用此代码时重构以删除额外的方法,但是没有使用额外方法的代码的人可能会重构以添加它。但同样-雅格尼。

        7
  •  0
  •   dave mankoff    14 年前

        8
  •  0
  •   Kris van der Mast    14 年前

    如果它是可重用的代码,那么就把它放在外面。还有一些编码准则,检查你公司的政策,强迫你选择第二种风格。

    天哪,克里斯。

        9
  •  0
  •   Stephen Cleary    14 年前

    但是,对于课堂教学(或演示代码),我认为直接使用事件处理程序没有什么错。