2010-03-15 89 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,你不需要手動編輯此代碼。