使用Lambda表达式订阅Click事件后,如何销毁或取消订阅?
使用Lambda订阅按钮Click事件后如何取消订阅
直接用匿名Lambda表达式(比如button1.Click += (s, e) => { MessageBox.Show("You clicked the button"); };)订阅事件的话,没法直接执行-=取消操作——因为匿名Lambda没有可引用的委托实例,.NET找不到要移除的那个委托对象。
解决方法主要有这几种:
提前把Lambda赋值给委托变量
先把Lambda表达式存到一个EventHandler类型的变量里,再用这个变量完成订阅和取消:// 定义委托变量存储Lambda EventHandler buttonClickHandler = (s, e) => { MessageBox.Show("You clicked the button"); }; // 订阅事件 button1.Click += buttonClickHandler; // 需要取消时执行 button1.Click -= buttonClickHandler;这个是最通用、最直接的方案,只要保留好委托变量的引用,就能随时取消订阅。
利用控件生命周期自动清理(UI场景)
如果是WinForms/WPF这类UI框架,当按钮所在的窗体被正确销毁(比如调用Dispose),控件自身的事件订阅会被自动清理,不会造成内存泄漏。但如果需要在控件销毁前主动取消(比如切换页面时),还是得用第一种方法。弱事件模式(特殊场景)
要是你担心委托引用导致内存泄漏(比如订阅者生命周期比按钮长),可以用.NET的弱事件模式,但对于按钮Click这种常规UI事件,一般没必要——常规场景下第一种方法完全够用,弱事件会增加复杂度。
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

