Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.net中添加和删除事件处理程序_C#_Events_Delegates - Fatal编程技术网

C# 在.net中添加和删除事件处理程序

C# 在.net中添加和删除事件处理程序,c#,events,delegates,C#,Events,Delegates,我最近创建了一个示例应用程序,在其中我实现了事件和委托,当属性值更改时,此事件将引发,我有一个关于事件的问题 事件对象是否在内存中创建?或者它们只是静态对象,一旦触发事件就会被删除 执行事件后是否需要删除处理程序以释放资源。删除处理程序是否会提高应用程序的性能?我指的是使用大量事件的应用程序 事件确实占用内存,在您取消订阅之前不会进行垃圾收集。它们是导致死亡的共同原因 事件可以是静态的,也可以是实例绑定的。当事件广播器处于活动状态时,事件的订阅者永远不会被删除,除非隐式删除,通常使用-=操作符

我最近创建了一个示例应用程序,在其中我实现了事件和委托,当属性值更改时,此事件将引发,我有一个关于事件的问题

  • 事件对象是否在内存中创建?或者它们只是静态对象,一旦触发事件就会被删除

  • 执行事件后是否需要删除处理程序以释放资源。删除处理程序是否会提高应用程序的性能?我指的是使用大量事件的应用程序


  • 事件确实占用内存,在您取消订阅之前不会进行垃圾收集。它们是导致死亡的共同原因

  • 事件可以是静态的,也可以是实例绑定的。当事件广播器处于活动状态时,事件的订阅者永远不会被删除,除非隐式删除,通常使用-=操作符

  • 对,对,对。如果你不清理你的订户,你就有一个内存泄漏等着发生


  • 如果所有这些都是您关心的问题,您也许可以研究一下模式。

    事件
    类似于
    代理
    (具有另一层保护)

    当您注册到一个事件时,您实际上是在引用另一个对象

    此对象无法通过GC,因为您对其进行了引用

    它不是“未引用的”

    但是您的对象可以通过GC。(如果未引用)

    因此,最终导致内存泄漏

    您应该手动删除引用