方法: カスタム イベントを宣言してメモリを節約する (Visual Basic)

場合によっては、アプリのメモリ使用量を抑えなければならないことがあります。 カスタム イベントを使用すると、アプリケーションが使用するメモリを、処理するイベントのものだけに制限できます。

既定では、クラスでイベントを宣言すると、メモリがそのイベント情報を格納するフィールドにコンパイラにより割り当てられます。 使用されないイベントがクラスに多数含まれている場合、これらによって不必要にメモリが占有されることになります。

Visual Basic に備わっている既定のイベント実装ではなく、カスタム イベントを使用することで、メモリ使用量を細かく管理できます。

次の例のクラスでは、Events フィールドに格納される EventHandlerList のインスタンス 1 つを使用して、使用中のイベントに関する情報を格納しています。 EventHandlerList クラスは、デリゲートの保持向けに最適化された list クラスです。

このクラスのイベントはすべて、Events フィールドを使用して、各イベントを処理しているメソッドを追跡します。

Public Class MemoryOptimizedBaseControl
    ' Define a delegate store for all event handlers.
    Private Events As New System.ComponentModel.EventHandlerList

    ' Define the Click event to use the delegate store.
    Public Custom Event Click As EventHandler
        AddHandler(ByVal value As EventHandler)
            Events.AddHandler("ClickEvent", value)
        End AddHandler
        RemoveHandler(ByVal value As EventHandler)
            Events.RemoveHandler("ClickEvent", value)
        End RemoveHandler
        RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
            CType(Events("ClickEvent"), EventHandler).Invoke(sender, e)
        End RaiseEvent
    End Event

    ' Define the DoubleClick event to use the same delegate store.
    Public Custom Event DoubleClick As EventHandler
        AddHandler(ByVal value As EventHandler)
            Events.AddHandler("DoubleClickEvent", value)
        End AddHandler
        RemoveHandler(ByVal value As EventHandler)
            Events.RemoveHandler("DoubleClickEvent", value)
        End RemoveHandler
        RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
            CType(Events("DoubleClickEvent"), EventHandler).Invoke(sender, e)
        End RaiseEvent
    End Event

    ' Define additional events to use the same delegate store.
    ' ...
End Class

関連項目