回答
這不是使用AddHandler與Handles的問題。
如果您擔心引用您的事件處理程序干擾垃圾回收,則應使用RemoveHandler,而不管處理程序是如何連接的。在窗體或控件的Dispose方法中,刪除所有處理程序。
我在Windows Forms應用程序(.NET 1.1天)中遇到了一些情況,事件處理程序將在沒有其他引用的情況下調用事件處理程序(對於所有意圖和目的, GC'ed) - 非常難以調試。
我會使用RemoveHandler來擺脫您不打算重用的控件的處理程序。
大多數情況下,框架爲您提供幫助。
手動分離事件對於防止內存泄漏非常重要:連接到由另一個對象觸發的事件的對象將不會被垃圾收集,直到觸發事件的對象被垃圾收集爲止。換句話說,「事件提升者」對所有與之相關的「事件監聽者」有很強的參考價值。
我發現動態連接/分離事件處理程序僅用於擁有長壽命對象的情況下公開許多短暫對象所使用的事件。對於大多數其他情況下,兩個對象大約在同一時間處理,並且CLR有足夠的自己清理工作
我很肯定Handles
子句只是語法糖,並將AddHandler
語句插入到您的構造函數。我測試了使用此代碼和殘疾人的應用程序框架,這樣的構造不會有多餘的東西:
Public Class Form1
Public Sub New()
' This call is required by the Windows Form Designer. '
InitializeComponent()
' Add any initialization after the InitializeComponent() call. '
AddHandler Me.Load, AddressOf Form1_Load
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim breakpoint As Integer = 4
End Sub
End Class
的IL弄成這個樣子:
IL_0000: nop
IL_0001: ldarg.0
IL_0002: call instance void [System.Windows.Forms]System.Windows.Forms.Form::.ctor()
IL_0007: nop
IL_0008: ldarg.0
IL_0009: ldarg.0
IL_000a: dup
IL_000b: ldvirtftn instance void WindowsApplication1.Form1::Form1_Load(object,
class [mscorlib]System.EventArgs)
IL_0011: newobj instance void [mscorlib]System.EventHandler::.ctor(object,
native int)
IL_0016: call instance void [System.Windows.Forms]System.Windows.Forms.Form::add_Load(class [mscorlib]System.EventHandler)
'... lots of lines here '
IL_0047: ldarg.0
IL_0048: callvirt instance void WindowsApplication1.Form1::InitializeComponent()
IL_004d: nop
IL_004e: ldarg.0
IL_004f: ldarg.0
IL_0050: dup
IL_0051: ldvirtftn instance void WindowsApplication1.Form1::Form1_Load(object,
class [mscorlib]System.EventArgs)
IL_0057: newobj instance void [mscorlib]System.EventHandler::.ctor(object,
native int)
IL_005c: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Form::add_Load(class [mscorlib]System.EventHandler)
IL_0061: nop
IL_0062: nop
IL_0063: ret
} // end of method Form1::.ctor
注意兩個代碼相同的塊左右IL_000b和IL_0051。我認爲這只是句法糖。
我手動創建控件(例如,爲每個數據庫記錄動態創建TextBox)時手動附加處理程序。我手動分離處理程序時,他們正在處理的事情,我還沒有準備好處理(可能是因爲我使用錯誤的事件?:))
聲明字段爲WithEvents
將導致編譯器自動生成一個屬性用那個名字。 getter返回後臺字段的值。制定者稍微複雜一點。它首先檢查後臺字段是否已經具有正確的值。如果是這樣,它就退出。否則,如果後備字段非空,它會將其所有事件的「RemoveHandler」請求發送到由後臺字段標識的對象。接下來,無論支持字段是否爲非空值,它都會將其設置爲等於所請求的值。最後,如果新值是非空值,那麼無論舊值是否爲新值,屬性都會將其所有事件的「AddHandler」請求發送到由新值標識的對象。
假設在丟棄它之前將對象的所有WithEvents成員設置爲Nothing
,並且避免在多個線程中操作WithEvents成員,自動生成的事件代碼將不會泄漏。
- 1. AddHandler vs. Handles - 有什麼區別?
- 2. 差Vs的AddHandler
- 3. Multipy function handles matlab
- 4. Vb.net的AddHandler MouseHover
- 5. 關於Handles in .Sortable()
- 6. DomEvent。 AddHandler
- 7. 動態AddHandler
- 8. AddHandler的對象
- 9. htaccess AddHandler ALL?
- 10. NGINX AddHandler等效?
- 11. htaccess和AddType/Addhandler
- 12. VSTO Outlook 2013 AddHandler Application.ItemContextMenuDisplay Not Firing
- 13. 動態用戶控件AddHandler
- 14. VB.Net線程和Addhandler問題
- 15. VB.net AddHandler與索引
- 16. Addhandler,button.click不使用VB.NET觸發
- 17. 模塊中'Handles Me.FormClosing'的替代方案
- 18. 錯誤:../../ mono/io-layer/handles-private.h:362
- 19. AddHandler無法正常工作
- 20. Silverlight VB AddHandler動態對象
- 21. 問題的AddHandler htaccess的
- 22. AddHandler是否需要參數?
- 23. 語法錯誤與VBScript中的AddHandler
- 24. Apache AddHandler:以ASP運行ASP代碼
- 25. Javascript禁用/啓用事件和$ addhandler
- 26. AddHandler/RemoveHandler沒有正確處置
- 27. 爲什麼XAML不等於AddHandler?
- 28. 如何在.htaccess中編寫AddHandler?
- 29. Strophe不使用javascript調用iq addHandler
- 30. F#如何AddHandler的一致好評VB.NET