Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.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
有没有办法清除VB.NET中事件的订阅?_Vb.net_Events_Subscription - Fatal编程技术网

有没有办法清除VB.NET中事件的订阅?

有没有办法清除VB.NET中事件的订阅?,vb.net,events,subscription,Vb.net,Events,Subscription,在C#中,我习惯于在Dispose()中清除对自定义事件的所有订阅,以避免订阅方忘记取消订阅我的事件而导致内存泄漏 这非常简单,只需调用MyEvent=null,因为C#编译器会自动生成一个委托字段。不幸的是,在VB.NET中,似乎没有简单的方法来实现这一点。我提出的唯一解决方案是编写一个自定义事件,添加调用委托的自定义添加和删除处理程序。合并/委托。删除,基本上就是C编译器所做的。但在我看来,每次活动都必须这样做,才能清除订阅似乎有点“矫枉过正” 有人有别的办法解决这个问题吗?谢谢。我对VB.

在C#中,我习惯于在
Dispose()
中清除对自定义事件的所有订阅,以避免订阅方忘记取消订阅我的事件而导致内存泄漏

这非常简单,只需调用
MyEvent=null
,因为C#编译器会自动生成一个委托字段。不幸的是,在VB.NET中,似乎没有简单的方法来实现这一点。我提出的唯一解决方案是编写一个
自定义事件
,添加调用
委托的自定义添加和删除处理程序。合并
/
委托。删除
,基本上就是C编译器所做的。但在我看来,每次活动都必须这样做,才能清除订阅似乎有点“矫枉过正”


有人有别的办法解决这个问题吗?谢谢。

我对VB.NET只有模糊的了解,但是AddHandler/RemoveHandler呢?

在VB.NET中完全一样。每个事件的编译器,就像C#编译器一样,但在VB中该字段是隐藏的。但是,您可以从代码中访问变量-它始终命名为XXXEvent,其中XXX是事件名称

因此,您可以轻松地清除对事件的订阅,就像在C中一样:


我还认为应该可以使用反射自动找到所有隐藏的委托变量,并清除它们。那么它们就不必在
Clear
方法中列出。

AddHandler/RemoveHandler是C#中+=和-=的VB.NET等价物。因为我不知道每个订阅者(除非我自定义了事件),所以我无法删除每个订阅者。谢谢!没有看到文档部分,非常有用。在使用反射时,仅仅将一些变量设置为null似乎很麻烦;但在调试时断言每个字段都正确地设置为null是非常有用的。我在想,可能会有一个通用方法ClearAllSubscriptions,它使用反射来处理任何类型:那么Clear方法中所需要的就是
ClearAllSubscriptions Me
Public Class Class1
  Implements IDisposable
  Event MyEvent()

  Sub Clear() Implements IDisposable.Dispose
    Me.MyEventEvent = Nothing ' clear the hidden variable '
  End Sub
End Class