Avatar billede odsgaard Praktikant
11. januar 2016 - 09:57 Der er 4 kommentarer og
1 løsning

Hvordan virker 'Equals'

Hej Eksperter

Jeg er rendt ind i et lille problem, som jeg ikke kan forstå. I nedenstående eksempel, udskrives der 'false' til konsollen, men jeg forventede faktisk at det ville være 'true'. Når jeg prøver at læse dokumentation for Equals ser det ud til at det burde virke som jeg forventer.

Er der nogle der kan komme med en forklaring?

Hilsen
Brian

class Program
    {
        static void Main(string[] args)
        {
            Car c1 = new Car("VW", "Passat");
            Car c2 = new Car("VW", "Passat");

            Console.WriteLine(c1.Equals(c2));
           
        }
    }

    class Car
    {
        public String Make { get; set; }
        public String Model { get; set; }

        public Car(string make, string model)
        {
            this.Make = make;
            this.Model = model;
        }
    }
Avatar billede Slater Ekspert
11. januar 2016 - 11:11 #1
Som du kan læse på https://msdn.microsoft.com/en-us/library/bsc2ak47.aspx
- så virker Equals kun som en værdisammenligning på ValueTypes. Når du sammenligner to objekter, er det i virkeligheden et tjek af, om de refererer samme instance, og her har du to forskellige instances af objektet, selvom de indeholder det samme.

Det virker selvfølgelig lidt mærkeligt eftersom C# skjuler pointers for en. Det ville være nemmere at se i f.eks. traditionelt C++. Den variabel du leger med er ikke selve objektet, det er bare en integer, som peger på en placering i heap'en hvor dit objekt ligger. Og den integer indeholder to forskellige ting, fordi den peger på to forskellige objekter, uanset at de er ens.
Avatar billede odsgaard Praktikant
11. januar 2016 - 13:29 #2
Jeg har lige afprøvet det i Java - og der opfører det sig på samme måde, så måske det er mig der husker helt forkert - jeg havde nemlig opfattelsen af at equals sammenlignede de to objekter.

Hvis man så vil sammenligne to objekter for at finde ud af om de er ens (ikke samme objekt), hvad skal man så gøre?

/Brian
Avatar billede arne_v Ekspert
11. januar 2016 - 15:43 #3
For en C# ref type skal du override Equals (og GetHashCode !) for at faa en fornuftig sammenligning.

Samme som i Java.
Avatar billede odsgaard Praktikant
27. januar 2016 - 08:02 #4
@Viperine

Smider du lige et svar, så jeg kan lukke spørgsmålet :)
Avatar billede Slater Ekspert
27. januar 2016 - 08:41 #5
Så gerne.
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

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