[英]When to use Weak Events?
我在弱事件上引用了MSDN教程。 我理解基礎知識。 我正在開發一個非WPF項目,我的課程正在暴露某些事件。 我的問題是弱事件是否完全取代舊的事件模式? 每個暴露事件的類都使用它是否好? 大量使用弱事件的副作用是什么?
根據我所做的閱讀,使用WeakEvents似乎沒有任何具體的負面影響,除了事實上這樣做更加冗長。 此外,在大多數情況下,您應該能夠在不再需要時從事件中手動取消注冊。 在某些情況下,這是不可能的。 例如,您引用的MSDN頁面應該在您應該使用WeakEvents時提及:
http://msdn.microsoft.com/en-us/library/aa970850.aspx
某些場景固有地適用於弱事件模式的應用。 一種這樣的場景是數據綁定。 在數據綁定中,源對象通常完全獨立於偵聽器對象,偵聽器對象是綁定的目標。 WPF數據綁定的許多方面已經在事件的實現方式中應用了弱事件模式。
唯一一個向他們提出任何負面影響的人就是這個博客:
一般來說,使用弱事件偵聽器有一些缺點:
- 它的符號很難看,“原始”的.NET方式看起來更好
- 你必須用字符串命名事件,這很糟糕(如果你知道更好的方法,請聯系我!)
- 它只能使用EventHandler的處理程序處理事件
- 你成為一個懶惰的開發人員,不關心訂閱
從本質上講,它們應該用於您的對象在其存在的整個長度內訂閱的事件,並且僅在對象被處置時斷開連接。 對於其他所有內容,首選使用傳統事件並手動注冊/取消注冊事件。
弱事件必須考慮兩個問題:
在弱事件模式中看到更多細節是危險的 。
請參閱此源代碼 ,該代碼使用MvvMCross消息傳遞插件作為弱事件管理器來說明此問題。
什么時候使用弱事件?
來自MSDN
偵聽事件可能會導致內存泄漏
所以你應該使用弱事件來避免這些泄漏
每個暴露事件的類都使用它是否好? 大量使用弱事件的副作用是什么?
請參閱為什么C#中的事件實現默認情況下不使用弱事件模式? 。 從“強”事件中泄漏並非通常情況,弱事件伴隨着性能成本並且具有在每種情況下可能都不需要的語義差異,濫用弱參考可能導致事件間歇性地不發射(與之相反)濫用導致內存泄漏的正常事件)
可以避免的內存泄漏示例
靜態類和單身人士在討論內存泄漏時是壞人,當他們獲得對其他對象的引用時,他們將阻止對象被垃圾收集,從而在應用程序的生命周期內泄漏對象, 這是我遇到的一個例子需要弱引用以避免內存泄漏
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.