Практическое руководство. Объявление пользовательских событий для экономии памяти (Visual Basic)

Существует несколько обстоятельств, когда важно, чтобы приложение не пользовалось памятью. Пользовательские события позволяют приложению использовать память только для событий, которые он обрабатывает.

По умолчанию, когда класс объявляет событие, компилятор выделяет память для поля для хранения сведений о событии. Если класс имеет много неиспользуемых событий, они не обязательно занимают память.

Вместо использования реализации событий по умолчанию, которые предоставляет Visual Basic, можно использовать пользовательские события для более тщательного управления использованием памяти.

Пример

В этом примере класс использует один экземпляр EventHandlerList класса, хранящийся в Events поле, для хранения сведений об используемых событиях. Класс EventHandlerList — это оптимизированный класс списка, предназначенный для хранения делегатов.

Все события в классе используют 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

См. также