' Visual Basic .NET Document Option Strict On ' Imports System.Collections Imports System.Collections.Generic Public Class TemperatureChangedEventArgs : Inherits EventArgs Private originalTemp As Decimal Private newTemp As Decimal Private [when] As DateTimeOffset Public Sub New(original As Decimal, [new] As Decimal, [time] As DateTimeOffset) originalTemp = original newTemp = [new] [when] = [time] End Sub Public ReadOnly Property OldTemperature As Decimal Get Return originalTemp End Get End Property Public ReadOnly Property CurrentTemperature As Decimal Get Return newTemp End Get End Property Public ReadOnly Property [Time] As DateTimeOffset Get Return [when] End Get End Property End Class Public Delegate Sub TemperatureChanged(sender As Object, e As TemperatureChangedEventArgs) Public Class Temperature Private Structure TemperatureInfo Dim Temperature As Decimal Dim Recorded As DateTimeOffset End Structure Public Event TemperatureChanged As TemperatureChanged Private previous As Decimal Private current As Decimal Private tolerance As Decimal Private tis As New List(Of TemperatureInfo) Public Sub New(temperature As Decimal, tolerance As Decimal) current = temperature Dim ti As New TemperatureInfo() ti.Temperature = temperature ti.Recorded = DateTimeOffset.UtcNow tis.Add(ti) Me.tolerance = tolerance End Sub Public Property CurrentTemperature As Decimal Get Return current End Get Set Dim ti As New TemperatureInfo ti.Temperature = value ti.Recorded = DateTimeOffset.UtcNow previous = current current = value If Math.Abs(current - previous) >= tolerance Then raise_TemperatureChanged(New TemperatureChangedEventArgs(previous, current, ti.Recorded)) End If End Set End Property Public Sub raise_TemperatureChanged(eventArgs As TemperatureChangedEventArgs) If TemperatureChangedEvent Is Nothing Then Exit Sub Dim ListenerList() As System.Delegate = TemperatureChangedEvent.GetInvocationList() For Each d As TemperatureChanged In TemperatureChangedEvent.GetInvocationList() If d.Method.Name.Contains("Duplicate") Then Console.WriteLine("Duplicate event handler; event handler not executed.") Else d.Invoke(Me, eventArgs) End If Next End Sub End Class Public Class Example Public WithEvents temp As Temperature Public Shared Sub Main() Dim ex As New Example() End Sub Public Sub New() temp = New Temperature(65, 3) RecordTemperatures() Dim ex As New Example(temp) ex.RecordTemperatures() End Sub Public Sub New(t As Temperature) temp = t RecordTemperatures() End Sub Public Sub RecordTemperatures() temp.CurrentTemperature = 66 temp.CurrentTemperature = 63 End Sub Friend Shared Sub TemperatureNotification(sender As Object, e As TemperatureChangedEventArgs) _ Handles temp.TemperatureChanged Console.WriteLine("Notification 1: The temperature changed from {0} to {1}", e.OldTemperature, e.CurrentTemperature) End Sub Friend Shared Sub DuplicateTemperatureNotification(sender As Object, e As TemperatureChangedEventArgs) _ Handles temp.TemperatureChanged Console.WriteLine("Notification 2: The temperature changed from {0} to {1}", e.OldTemperature, e.CurrentTemperature) End Sub End Class '