将“公共事件EventHandler <eventargs> MyEvent = delegate {}”中的委托{}转换为vb.net </eventargs>

时间:2012-09-07 09:40:02

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

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

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

现在我发现了这篇文章,我想尝试一下。但我不知道delegate{}是什么 public event EventHandler<EventArgs> MyEvent = delegate { };表示。

2 个答案:

答案 0 :(得分:3)

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

// 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 :(得分:1)

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

如果您不想担心{},请将其关闭:

public event EventHandler MyEvent;

并进行空检查!