Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

23.3. System.IEquatable(Of T)

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

23.3.1. Object.Equals Method

Van het type System.Object erft elk type een publieke Equals method over.

Het voordeel hiervan is dat elke type in zijn publieke interface een method bevat die bruikbaar is om gelijkheid tussen verschillende objecten van dat type na te gaan.

Het nadeel is echter dat deze Equals method werkt met een argument van het type Object, waardoor de compiler ons zal toestaan een object van een bepaald type te vergelijken met objecten van eender welk ander type.

Zo kan in onderstaand voorbeeld een Person object vergeleken worden met een Integer, wat uiteraard niet de bedoeling is :
Visual Basic 2012 Broncode - Codevoorbeeld 592
Option Strict On
Option Explicit On
Namespace Example1
    Class Person
        Public Property Name As String
        Public Overrides Function Equals(ByVal obj As Object) As Boolean
            If obj IsNot Nothing AndAlso TypeOf obj Is Person Then
                Equals = Name.Equals(DirectCast(obj, Person).Name)         ' (1)
            End If
        End Function
        Public Overrides Function GetHashCode() As Integer
            GetHashCode = Name.GetHashCode()
        End Function
    End Class
    Class Client
        Public Shared Sub Main()
            Dim person1 As New Person With {.Name = "John"}
            '
            Console.WriteLine(person1.Equals(5)) ' False
            '
            Console.ReadLine()
        End Sub
    End Class
End Namespace
Console Application Output
False
Twee personen worden als logisch gelijk beschouwd indien ze dezelfde naam hebben.

Omdat bovenstaand voorbeeld wordt uitgevoerd onder Option Strict On, is het hier noodzakelijk de argumentvariabele obj te casten naar een Person expressie vooraleer de compiler zal toelaten de Name property aan te roepen (1).

De compiler laat ons toe bovenstaand voorbeeld te compileren, pas at runtime merkt de implementatie dat de doorgegeven Integer waarde niet van type Person is.

Vergeet niet dat elke type die de Equals method overschrijft de ook al van Object overgeërfde method GetHashCode moet overschrijven.
Zie de topics over hashcodes voor meer details.

23.3.2. System.IEquatable(Of T) Interface

Om een typesafe Equals achtige method te voorzien kan men ook de IEquatable(Of T) interface implementeren.

Deze vereist een implementatie voor de Equals(ByVal other As T) method,  waar dan wel met een argument van het juiste type (het actueel generisch parametertype) wordt gewerkt :
Visual Basic 2012 Broncode - Codevoorbeeld 593
Namespace Example2
    Class Person : Implements IEquatable(Of Person)
        Public Property Name As String
        Public Overrides Function Equals(ByVal obj As Object) As Boolean
            If TypeOf obj Is Person Then
                Equals = Equals(DirectCast(obj, Person))
            End If
        End Function
        Public Overloads Function Equals(ByVal other As Person) As Boolean _
                                         Implements IEquatable(Of Person).Equals
            If other IsNot Nothing Then Equals = Name.Equals(other.Name)
        End Function
        Public Overrides Function GetHashCode() As Integer
            GetHashCode = Name.GetHashCode()
        End Function
    End Class
    Class Client
        Public Shared Sub Main()
            Dim person1 As New Person With {.Name = "John"}
            Dim person2 As New Person With {.Name = "John"}
            '
            Console.WriteLine(person1.Equals(person2))
            '
            Dim object1 As Object = person1
            Dim object2 As Object = person2
            Console.WriteLine(object1.Equals(object2))                    ' (1)
            '
            Console.WriteLine(person1.Equals(5))
            '
            Console.WriteLine(person1.Equals(Nothing))
            '
            Console.ReadLine()
        End Sub
    End Class
End Namespace
Console Application Output
True
True
False
Een implementatie van een generisch instantie van IEquatable(Of T) is geen vervanging van het herdefiniëren van de van Object overgeërfde Equals(obj As Object) method.
Indien immers twee logisch gezien gelijke Person objecten in Object vorm met elkaar vergeleken worden (2), zou de overgeërfde implementatie fysieke gelijkheid nagaan.  Zo zijn de personen in de variabelen object1 en object2 logisch gezien gelijk aan elkaar, een Equals zou dus True moeten opleveren.  Indien we de Overrides Function Equals(ByVal obj As Object) achterwege laten, zou de call op regel (2) echter False opleveren.

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.