C# 在哪里注册C事件?

C# 在哪里注册C事件?,c#,events,C#,Events,我目前正在从VB过渡到C,在注册我对某个活动的兴趣方面遇到了一些问题 当使用VB时,它只是指定一个方法处理和事件的情况,这通常是通过使用对象事件列表生成的。虽然我可以很容易地在C中使用Class.event+=委托,但我不确定最好的地方是将代码放在哪里 我最好根据生成的代码将其放置在InitializeComponent中,比如说,如果您在from designer中选择事件,还是我应该将其放置在构造函数中,以提高可读性/维护性。如果在构造函数中,它应该在调用InitializeComponen

我目前正在从VB过渡到C,在注册我对某个活动的兴趣方面遇到了一些问题

当使用VB时,它只是指定一个方法处理和事件的情况,这通常是通过使用对象事件列表生成的。虽然我可以很容易地在C中使用Class.event+=委托,但我不确定最好的地方是将代码放在哪里


我最好根据生成的代码将其放置在InitializeComponent中,比如说,如果您在from designer中选择事件,还是我应该将其放置在构造函数中,以提高可读性/维护性。如果在构造函数中,它应该在调用InitializeComponent之前还是之后?

我总是创建一个名为Init的私有方法并将其放置在那里,然后从构造函数或表单加载事件处理程序调用该方法。依我看,这在语义上比在构造器中进行要好。您不希望将其放在InitializeComponent中,因为下次在设计器中更改某些内容时,可能会删除任何手动添加的代码。

这取决于具体情况,但大多数情况下都是这样

如果希望在整个表单期间挂起事件,请使用InitializeComponent。我假设您正在谈论表单/UserControls/等等。。在其他情况下,您需要更细粒度地控制事件的处理时间


请记住,在处理表单时,您可能希望使用-=语法解除所有这些事件的挂钩,或者不再希望处理该事件。保持事件处理程序委托的连接是最常见的托管内存泄漏之一。

当您在进行WinForm开发时,从上面提到的InitializeComponent函数判断,通常您使用Visual Studio分配处理程序。您可以查找控件的属性,单击lightning图标以获取所有事件的列表,找到您的事件,然后双击它以创建新的处理程序,或者从列表中选择现有的处理程序。Visual Studio将在生成的代码中添加这方面的连接,因此您不必担心它。

如果您有InitializeComponent方法,则您正在使用设计器,以便可以直接在设计器中绑定事件(如果您愿意)。要执行此操作,请单击“属性”窗口中的闪电图标,您将看到选定对象的所有事件的列表。您只需在其中键入事件的名称,它就会为您创建代码


如果您不喜欢设计器,请在InitializeComponent调用后绑定它们,并确保在Dispose中完成后将它们分离。

2种方法。您可以创建自己的方法,在构造函数中调用该方法,从而创建事件处理程序,也可以将它们放在构造函数中。删除终结器/析构函数代码中的事件处理程序可能是个好主意。

不要手动向InitializeComponent方法添加代码。此方法是由代码生成的,所以只要您更改表单,您手动添加到此方法的任何逻辑都将被删除


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

我会将它放在InitializeComponent之后,因为您可能会针对子控件/对象(如按钮)注册事件,并且您需要确保对象已经创建


在某些情况下,您会在其他位置动态/有条件地连接到事件,例如响应其他事件。

有时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.cs中的InitializeComponent方法中的代码,因此,您必须不要手动编辑此代码。

我看到您仍然可以这样做,但我也有来自DLL的类可以引发事件,我必须通过代码注册这些类。如果您需要注册来自某些业务对象的事件,我会将其与UI事件分开,因为它们的用途完全不同。理想情况下,在您的业务逻辑类中执行此操作,如果不可能,则可以在表单的Load event handler中执行。我注意到,如果使用照明图标生成+=则不会生成相应的-=。我应该把这些放在哪里?当然,一旦引用超出范围,GC就应该对此进行管理?您需要重写Dispose方法并将其取消挂钩。假设您的组件是自包含的,即到GC根的路径不包含任何未超出范围的对象,那么您是正确的-这将得到GC。但是,如果您使用静态处理程序,或者在附加了其他事件但未分离的情况下公开这些控件,则它们 永远不要超出范围,这会导致托管内存泄漏。