2012-09-07 43 views
0

我有一個關於這篇文章的問題: http://davybrion.com/blog/2009/09/event-subscribtion-and-memory-leaks-yet-again/翻譯委託{}在「公共事件的EventHandler <EventArgs> MyEvent =委託{}」到VB.NET

我有內存泄漏與事件vb.net。我認爲我和內存分析器應用程序,它說我的問題是:-(

現在我已經找到了這篇文章,我想嘗試的事件。但我不知道delegate{}什麼 public event EventHandler<EventArgs> MyEvent = delegate { };的意思

+1

請注意,你不必做一個空檢查在VB.Net就像你通常做在C#中舉辦活動時。 – sloth

回答

1

這只是一種偷偷摸摸的方式來避免必須對事件進行空值檢查;基本上它使用匿名方法作爲初始值,但該方法不會執行任何操作。詳細信息,這個空的委託實例實際上被緩存在一個靜態字段中,所以它不會對每個實例產生巨大影響

如果你不想擔心{},那麼只要把它關閉:

public event EventHandler MyEvent; 

,做零檢查!

+2

您不需要在VB.NET中執行null(Nothing)檢查。 'RaiseEvent'關鍵字爲你做。 – Enigmativity

+0

@Enigmativity我意識到這一點,但問題中的代碼也不會在VB中編譯; p –

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但是您根本不需要*在VB中完成此操作! TheRaiseEvent關鍵字爲您執行空檢查。 C#是如此詳細 MarkJ

+0

其實,不,這些都不是***相同。如果你檢查IL,你的最後一個版本會創建一個新的委託對象*每個實例*。匿名方法版本具有靜態字段來緩存委託對象,所以只創建委託...即27個對象共享相同的委託,但27個對象具有27個委託給「處理器」。 –

+0

@MarcGravell感謝您的澄清。 –