【问题标题】:Translate delegate{} in "public event EventHandler<EventArgs> MyEvent = delegate { }" to vb.net将“public event EventHandler<EventArgs> MyEvent = delegate {}”中的 delegate{} 翻译成 vb.net
【发布时间】:2012-09-07 09:40:01
【问题描述】:

我对这篇文章有疑问: http://davybrion.com/blog/2009/09/event-subscribtion-and-memory-leaks-yet-again/

我在 vb.net 中出现内存泄漏事件。我用内存分析器查看我的应用程序,它说我的问题是事件:-(

现在我找到了这篇文章,我想试试。但我不知道delegate{}public event EventHandler&lt;EventArgs&gt; MyEvent = delegate { }; 表示。

【问题讨论】:

  • 请注意,在引发事件时,您不必像通常在 C# 中那样在 VB.Net 中进行空值检查。

标签: c# vb.net events memory-leaks c#-to-vb.net


【解决方案1】:

它只是一个空的事件处理程序,它存在(因此不需要检查null)但什么也不做。以下代码sn-ps基本相同:

// An anonymous delegate (your example):
public event EventHandler<EventArgs> MyEvent = delegate { };

// The same function using Lambda:
public event EventHandler<EventArgs> MyEvent = (sender, e) => { };

// A similar function using a named method:
public event EventHandler<EventArgs> MyEvent = Handler;
private static void Handler(object sender, EventArgs eventArgs) { }

翻译成 VB.Net:

Public Class SomeClass
    Public Event MyEvent(ByVal sender As Object, ByVal e As EventArgs)

    // The following sub is the empty delegate
    Private Sub Handler(ByVal sender As Object, ByVal e As EventArgs) _
                        Handles Me.MyEvent
        // empty
    End Sub
End Class

【讨论】:

  • +1 但是您根本不需要在 VB 中执行此操作! TheRaiseEvent 关键字为您进行空值检查。 C# 太冗长了
  • 其实,不,这些是相同的。如果您检查 IL,您的上一个版本会创建一个新的委托对象每个实例。匿名方法版本有一个静态字段来缓存委托对象,所以只创建委托......即27个对象共享相同的{}委托,但27个对象有27个委托给@ 987654325@.
【解决方案2】:

这只是避免对事件进行空值检查的一种偷偷摸摸的方法;基本上,它使用匿名方法作为初始值,但该方法不做任何事情。作为一个实现细节,这个空的委托实例实际上被缓存在一个静态字段中,因此它不会对每个实例产生巨大的影响。

如果你不想担心{},那就别管它了:

public event EventHandler MyEvent;

并进行空检查!

【讨论】:

  • 您不需要在 VB.NET 中执行 null (Nothing) 检查。 RaiseEvent 关键字为您完成。
  • @Enigmativity 我知道这一点,但问题中的代码也不会在 VB 中编译;p
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 2016-10-30
相关资源
最近更新 更多