Avatar billede websam Nybegynder
01. marts 2006 - 22:15 Der er 12 kommentarer og
1 løsning

Equals metode i en info klasse ?

Dette er en fortsættelse af denne tråd : http://www.eksperten.dk/spm/691911

Imports System
Imports System.Collections

Namespace E
    Public Class Foobar
        Private iv As Integer
        Private sv As String

        Public Sub New()
            MyClass.New(0, "")
        End Sub

        Public Sub New(ByVal iv As Integer)
            MyClass.New(iv, "")
        End Sub

        Public Sub New(ByVal iv As Integer, ByVal sv As String)
            Me.iv = iv
            Me.sv = sv
        End Sub

        Public Overloads Overrides Function ToString() As String
            Return ("[" & iv & "," & sv & "]")
        End Function

        Public Overloads Overrides Function Equals(ByVal o As Object) As Boolean
            Return (iv = CType(o, Foobar).iv)
        End Function

        Public Overloads Overrides Function GetHashCode() As Integer
            Return iv.GetHashCode
        End Function
    End Class

    Class MainClass
        Public Shared Sub Main(ByVal args As String())
            Dim lst As ArrayList = New ArrayList
            lst.Add(New Foobar(1, "A"))
            lst.Add(New Foobar(2, "BB"))
            lst.Add(New Foobar(3, "CCC"))
            Dim ix As Integer = lst.IndexOf(New Foobar(2))
            If ix >= 0 Then
                Console.WriteLine(lst(ix))
            Else
                Console.WriteLine("Not found")
            End If
        End Sub
    End Class
End Namespace

Det første i koden Fields og Default constructors er der ikke problemer med at forstå. Derimod er jeg lidt i tvivl om brugen af metoden ToString da jeg læste en artikel om dette hvor de bla. skriver følgende :

"Men hvad bruger man så egentlig ToString-funktionen til? Og hvad er det, der gør den misforstået? Brugen af ToString-funktionen bør generelt begrænse sig til udviklings-orienterede situationer, hvor man til brug for debugning ønsker at få en tekstuel repræsentation af et objekts data. Desværre ser man ofte eksempler på at forretningsklasser overskriver ToString-funktionen til brug i forbindelse med brugergrænseflader. Et eksempel på en pæn flerlags-arkitektur er dette langt fra."

hele artiklen kan læses her :
http://www.captator.dk/captator.aspx?article=116

Selve Equals metoden :

Public Overloads Overrides Function Equals(ByVal o As Object) As Boolean
    Return (iv = CType(o, Foobar).iv)
End Function

Den kunne jeg godt bruge en forklaring til :
1. Hvad går den ?
2. I dette til fælde retuneres som jeg forstår det iv, hvis så jeg skal søge igennem mit array hvor jeg f.eks ville lede efter et navn  skal jeg så have en Equals metode mere ?

Metoden GetHashCode :

Public Overloads Overrides Function GetHashCode() As Integer
    Return iv.GetHashCode
End Function

1. Hvad gør den ?

Ellers er resten lige ud af landevejen :o)

/Websam
Avatar billede arne_v Ekspert
01. marts 2006 - 22:21 #1
det er rigtigt at man normalt ikke bruger ToString til at vise data for brugerne

men det giver absolut mening at bruge den til logging etc.

og det haender ogsaa at man skal igang med at troubleshoote eksisternde kode

saa der er absolut ingen grund til at fjerne ToString - der er faktisk meget
god grund til at have en ToString paa mange klasser

man skal bare ikke bruge den til at vise ting i win forms eller web forms
Avatar billede arne_v Ekspert
01. marts 2006 - 22:26 #2
Equals returnerer true hvis o har samme vaerdi for iv som me
Avatar billede arne_v Ekspert
01. marts 2006 - 22:28 #3
GetHashCode boer ogsaa overrides naar man overrider Equals
Avatar billede websam Nybegynder
01. marts 2006 - 22:40 #4
ToStrings >>

I dette tilfælde laver du jo netop både iv og sv om til String og det er vel ikke hensigts mæssigt når "mit id" i min arraylist er angivet til at være integer ?

Equals >>
Hvis jeg så forstår det korrekt så skal o have samme værdi som det iv der smides ind i denne linie :

Dim ix As Integer = lst.IndexOf(New Foobar(2))

i metoden Public Shared Sub Main(ByVal args As String())

GetHashCode >>
Det er fint at den skal overrides når Equals bliver det, men hvad er der sker i den metode ?

/Websam
Avatar billede arne_v Ekspert
01. marts 2006 - 22:49 #5
jeg laver ikke noget om - jeg returnerer bare en tekstuel version af objektet

saa

Console.WriteLine(lst(ix))

udskriver noget fornuftigt

----

Equals vil returnere true jhvis de 2 objekter har samme iv

det goer at IndexOf kan finde et objekt paa den angivne maade

----

den returnerer en hash kode for objektet

bruges bl.a. i Hashtable klassen

da GetHashCode skal returnere samme vaerdi for 2 instanser naar Equals
siger at de er ens skal den rettes til
Avatar billede websam Nybegynder
02. marts 2006 - 13:14 #6
#####################################################################################
jeg laver ikke noget om - jeg returnerer bare en tekstuel version af objektet

saa

Console.WriteLine(lst(ix))

udskriver noget fornuftigt
-------------------------------------------------------------------------------------
Altså skal jeg blot se på det på den måde at uanset hvilket format iv og is har så udskrives det som string ?
#####################################################################################

Det sidste jeg ikke fik med angående Equals metoden er at hvis jeg nu skulle kunne søge på både et Id og et Navn, skal jeg så lave en ekstra equals metode eller hvordan forholder det sig med det ?

/Websam
Avatar billede websam Nybegynder
02. marts 2006 - 14:46 #7
Dette har ikke noget med denne tråd at gøre, men kunne det ikke være at det her var noget for dig :

http://www.eksperten.dk/spm/692138

/Websam
Avatar billede arne_v Ekspert
02. marts 2006 - 14:56 #8
uden den ToString maate jeg skrive

Console.WriteLine(lst(ix).Piv & " " & lst(ix).Psv)

[der skulle lige vaere nogle properties men dem ville jeg jo nok slkulle bruge
alligevel i et realistisk scenarie]

jeg er doven og synes at det er nemmere at skrive

Console.WriteLine(lst(ix))

som kraever en ToString for at faa noget fornuftigt ud

----

Nej saa skal Equals bare teste paa baade iv og sv
Avatar billede websam Nybegynder
02. marts 2006 - 22:29 #9
Og skal Equals så se sådan her ud :

Public Overloads Overrides Function Equals(ByVal o As Object) As Boolean
    Return (iv = CType(o, Foobar).iv, is = CType(o, Foobar).is)
End Function
Avatar billede arne_v Ekspert
02. marts 2006 - 23:05 #10
nej

Public Overloads Overrides Function Equals(ByVal o As Object) As Boolean
    Return (iv = CType(o, Foobar).iv And sv = CType(o, Foobar).sv)
End Function
Avatar billede websam Nybegynder
02. marts 2006 - 23:06 #11
Det var da tæt på *GG*
Avatar billede websam Nybegynder
09. marts 2006 - 14:18 #12
smid et svar ;o)
Avatar billede arne_v Ekspert
09. marts 2006 - 14:58 #13
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester