|
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
23.3.1. Object.Equals MethodVan 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 2010 Broncode Option Strict OnOption Explicit OnNamespace Example1 Class Person Private m_Name As String Public Property Name() As String Get Name = m_Name End Get Set( ByVal value As String) m_Name = value End Set End Property 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) 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)) Console.ReadLine() End Sub End ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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. boven
23.3.2. System.IEquatable(Of T) InterfaceOm 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 2010 Broncode Namespace Example2 Class Person : Implements IEquatable( Of Person) Private m_Name As String Public Property Name() As String Get Name = m_Name End Get Set( ByVal value As String) m_Name = value End Set End Property 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)) Console.WriteLine(person1.Equals(5)) Console.WriteLine(person1.Equals( Nothing)) Console.ReadLine() End Sub End ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|