Porady: deklarowanie zdarzeń niestandardowych w celu zachowywania pamięci (Visual Basic)

Istnieje kilka sytuacji, w których ważne jest, aby aplikacja zachowywała niskie użycie pamięci. Zdarzenia niestandardowe umożliwiają aplikacji używanie pamięci tylko dla zdarzeń, które obsługuje.

Domyślnie, gdy klasa deklaruje zdarzenie, kompilator przydziela pamięć dla pola do przechowywania informacji o zdarzeniu. Jeśli klasa ma wiele nieużywanych zdarzeń, niepotrzebnie zajmują pamięć.

Zamiast używać domyślnej implementacji zdarzeń zapewnianych przez program Visual Basic, można użyć zdarzeń niestandardowych do dokładniejszego zarządzania użyciem pamięci.

Przykład

W tym przykładzie klasa używa jednego wystąpienia EventHandlerList klasy przechowywanego Events w polu do przechowywania informacji o używanych zdarzeniach. Klasa EventHandlerList jest zoptymalizowaną klasą listy przeznaczoną do przechowywania delegatów.

Wszystkie zdarzenia w klasie używają Events pola, aby śledzić, jakie metody obsługują każde zdarzenie.

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

Zobacz też