当前位置: 首页 > 编程语言 > C#

第一行:WeakReference-to-aLambda事件处理程序分享

时间:2023-04-11 00:35:52 C#

第一行:WeakReference-to-aLambda事件处理程序除了多次使用会违反DRY原则之外,你能看到吗这种单线的缺点是什么?这看起来很简单,但我还没有看到其他人问过这个问题,这让我想知道它是否有缺点。此代码创建一个方法的WeakReference,然后注册一个调用引用目标的事件处理程序。SomeEvent+=(sender,e)=>((Action)(newWeakReference((Action)ProcessEvent)).Target)();谢谢,本,我不认为这种模式符合您的预期。您是否试图阻止事件持有对当前对象的引用以防止内存泄漏?lambda表达式将捕获this的值以评估ProcessEvent(假设ProcessEvent是一个实例方法),因此您仍然会有泄漏。此代码与SomeEvent+=(sender,e)=>ProcessEvent();相同.您可能正在尝试做更像这样的事情(这也不是您想要的):varreference=newWeakReference((Action)ProcessEvent);SomeEvent+=(sender,e)=>((Action)reference.Target)();现在lambda表达式将捕获WeakReference,因此您不会对它有强引用。不幸的是,没有其他东西引用从ProcessEvent创建的委托,所以即使它仍然存在,它也会在下一次GC中被删除。(这也不检查Target是否为空)。你可以尝试这样的事情:publicEventHandlerMakeWeakHandler(Actionaction,Actionremove){varreference=newWeakReference(action.Target);varmethod=action.Method;事件处理程序处理程序=null;handler=delegate(objectsender,EventArgse){vartarget=reference.Target;如果(目标!=null){method.Invoke(目标,null);}else{删除(处理程序);}};返回处理程序;然后像这样使用它:SomeEvent+=MakeWeakHandler(ProcessEvent,h=>SomeEvent-=h);这将保持对ProcessEvent的接收者的弱引用,并在收集事件后自动从事件中删除事件处理程序,只要事件是周期性的,这就可以防止内存泄漏。它不是很可读。如果您必须单步执行它,那么这些操作中的任何一个都可能失败,但那一行将失败。此外,您只能引用堆栈跟踪中的那一行。为了可维护性,您通常希望避免在一行中执行太多操作。以上就是本次C#学习教程分享的全部内容:第一行:WeakReference-to-aLambdaeventhandler。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: