2010-07-13 186 views
2

我有一個連續運行的應用程序,它創建和銷燬類其中有一些像鼠標點擊事件和事件等等...... 第一個問題是什麼是正確的方法退訂?如果訂閱這個樣子的:C#.NET合適的事件訂閱和取消訂閱

Panel1.MouseClick += new MouseEventHandler(Action_MouseClick); 

是正確的退訂這樣的:

Panel1.MouseClick -= new MouseEventHandler(Action_MouseClick); 

還是確定要做到這一點:

Panel1.MouseClick -= Action_MouseClick; 

或者是無論哪種方式好不好?

我的另一個問題是,是,如果我使用微軟的Visual C#工作室通過設計人員創建的事件,它會自動退訂的「處置」方法的一部分?或者我仍然需要在代碼中放置取消訂閱方法?

回答

2

任何取消訂閱的方式都會產生相同的效果,並且兩者都是正確的。

至於你的其他問題。如果您使用設計的窗體上創建控件的事件,當窗體被設置在事件源不再存在,所以他們不會被調用。我想我說的是沒有必要拆除這些事件。

+0

感謝qstarin ......我注意到,如果類已經得到妥善處置,如果我不退訂一些由設計者設定的事件的節目會慢慢泄漏內存和我想知道,這意味着雙擊上設計器中的Button將創建buttonClick事件。但我並沒有贊成這些事件。 根據文章: 「http://msdn.microsoft.com/en-us/library/ms366768%28VS.80%29.aspx」 林想知道如果垃圾收集器是從堆中刪除對象如果我沒有參加這些活動。 – ecklerpa 2010-07-13 20:24:17

+0

從那篇文章中,「只要發佈對象擁有該引用,您的訂閱對象就不會被垃圾收集。「 表單上的一個控件是發佈對象,對控件的唯一引用是其表單中的成員變量(通常是這種情況,除非你特別保留對控件的引用),因此,一旦表單不見了,GC不能達到控制,因此不能到達組播代理 所有引用無法訪問,應該收集 – 2010-07-13 20:39:51

+0

另外,作爲一個健全性檢查,我會認爲,如果設計器自動訂閱,但不自動取消訂閱,導致內存泄漏,然後一大堆.Net應用程序會有這個問題 - 也許很明顯,情況並非如此(或者我們會聽到更多,是的) – 2010-07-13 20:41:18

1

我的另一個問題是,是,如果我使用 微軟的Visual C#工作室通過設計人員創建 的事件,並 它會自動退訂的「處置」方法的一部分 ?或者我仍然需要 的取消訂閱方法在 的代碼?

從內存:不,它不會生成取消訂閱代碼。

您可以雙擊打開該文件classname.designer.cs並檢查產生Dispose方法來檢查這個自己。

+0

你是對的,它不是。 – 2010-07-13 20:14:10

+0

謝謝你們!我很感激它...... – ecklerpa 2010-07-13 20:37:34

+0

只是一個更新......它確實有助於使用您創建的軟件的「發佈」版本...我發現系統將比「調試」更好地移除分配給應用程序的內存,版本。 – ecklerpa 2010-07-19 21:51:33

1

設計器代碼不會自動取消訂閱,但只要表單及其所有控件不再可以從應用程序代碼訪問,訂閱就不應該使控件保持活動狀態。當訂閱者和事件生產者具有不同的生命週期時,滯留事件處理程序主要是一個問題,對於表單及其控制通常不應該是這種情況。

如果你創建/刪除動態控制,你可能要管理的事件,雖然這不是絕對必要的,刪除的控制不再被引用和移出的對照停止射擊的事件。