2010-03-15 67 views
5

我目前正在从VB转换到C#,并在注册我对事件的兴趣方面遇到一些问题。在哪里注册C#事件?

使用VB时,仅仅是指定方法Handles和事件,通常这是通过使用对象事件列表生成的。虽然我可以很容易地在C#中使用Class.event += delegate,但我不确定放置代码的最佳位置。

我最好把它放在InitializeComponent()里面,根据生成的代码(比如说,如果你从from设计器中选择事件),还是应该把它放在构造器中以便更好的读取/维护。如果在构造函数中,应该在调用InitializeComponent()之前还是之后?

回答

5

当您正在进行WinForm开发(从所提到的InitializeComponent()函数来判断)时,通常使用Visual Studio分配处理程序。您可以查看控件的属性,点击闪电图标以获取所有事件的列表,找到您的事件,并双击它(创建一个新的处理程序),或者从列表中选择现有的处理程序。 Visual Studio将在生成的代码中添加这种连线,所以您不必担心它。

+0

我看到你仍然可以做到这一点,但我也有一个DLL引发事件的类,我必须通过代码注册这些类。 – themaninthesuitcase 2010-03-15 15:15:37

+1

如果您需要注册某些业务对象的事件,我会将其与UI事件分开(因为它们的用途完全不同)。理想的做法是在您的业务逻辑类中进行,如果它不可能比在例如加载表单的事件处理程序。 – Grzenio 2010-03-15 15:19:31

3

我总是创建一个名为Init()的私有方法,并将其放置在那里,然后从构造函数或Form_Load事件处理函数中调用该方法。国际海事组织在语义上更好,而不是在构造函数内部进行。而且您不希望将其放置在InitializeComponent()之内,因为下次您在设计器中更改某些内容时,可能会删除所有手动添加的代码。

1

这取决于,但大部分时间,是的。

当你希望事件挂钩整个表单持续时间时(我假设你在谈论Forms/UserControls/etc)时,使用InitializeComponent。在其他情况下,您需要更好地控制何时处理事件。

请记住,当您处置表单或不再需要处理事件时,您需要解除所有这些事件(使用 - =语法)。保持附加的事件处理程序委托是最常见的托管内存泄漏之一。

+0

我已经注意到,如果我使用照明图标生成+ =没有相应的 - =生成。我应该把这些放在哪里? 当然,一旦参考超出范围,GC应该管理这个 ? – themaninthesuitcase 2010-03-15 15:17:09

+0

您需要重写Dispose方法并解除它们。假设你的组件是独立的(即GC根的路径不包含任何未超出范围的对象),那么你是正确的 - 这将得到GC'd。但是,如果您使用静态处理程序,或者在其他事件附加(但未分离)的位置公开这些控件,则它们永远不会“超出范围”,从而导致您的管理内存泄漏。 – micahtan 2010-03-15 16:22:36

0

如果你有InitializeComponent()方法,你使用的是设计器,所以你可以直接在设计器中绑定事件,如果你喜欢。为此,请单击属性窗口中的闪电图标,您将看到所选对象的所有事件的列表。你可以在那里输入事件的名称,它会为你创建代码。

如果您不是设计师的粉丝,请在拨打InitializeComponent后与他们绑定,并确保在完成后将其分开(位于Dispose())。

0

2种方法。你可以创建你自己的方法,你可以在你的构造函数中调用它来创建事件处理程序,或者你可以将它们放在你的构造函数中。在Finalizer/Destructor代码中删除事件处理程序可能是一个好主意。

1

不是手动添加代码到InitializeComponent()方法。此方法是代码生成的,因此只要您更改表单,手动添加到此方法的任何逻辑都将被清除。

我通常会添加一个方法来处理表格的Load事件,并在那里放置我的事件注册。

0

我会把它放在InitializeComponent之后,因为你可能会注册一个子控件/对象的事件,比如一个按钮,并且你会想要确保该对象已经被创建。

有些情况下,您可以在其他地方动态/有条件地连接事件,例如响应其他事件。

2

有时Visual Studio的设计师可以搞砸的代码,因此增加内InitializeComponent事件处理程序可以创建一个头痛,倒不如去做这样的事情

 
public Form1(){ 
    InitializeComponent(); 
    WireUpEvents(); 
} 

public void WireUpEvents(){ 
    this.fooEvent += new EventHandler(foo_handler); 
    .... etc .... 
} 

,并确保您删除事件处理程序的窗体的Dispose功能也...

 
public void UnWireEvents(){ 
    this.fooEvent -= new EventHandler(foo_handler); 
    .... etc .... 
} 

当你设计表单,Visual Studio将改变位于form.design.csInitializeComponent()方法中的代码,因此它是imperativ e,你不需要手动编辑此代码。