Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

January 13, 2013 / by Zsolt Soczó

HashSet.Add végtelen ciklus?

HashSetbe akartam berakni hibernate entitásokat, amelyek Equals-sza és GetHashCode-ja így nézett ki:

public virtual bool Equals(EntityBase other)
{
if (other == null)
{
return false;
}
if (Id == 0)
{
//Transient object
return ReferenceEquals(this, other);
}
return other.Id == Id;
}

public override bool Equals(object obj)
{
if (!(obj is EntityBase))
{
return false;
}
return Equals((EntityBase)obj);
}

public override int GetHashCode()
{
return Id;
}

A HashSet.Add-nak beadva egy ilyen entitás példányt az Add soha nem tért vissza, végtelen ciklusba került. Miért?

Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

LEAVE A COMMENT

16 COMMENTS

  • kkető January 14, 2013

    Anélkül, hogy jobban belekutatnék (hibernate sose volt túl szimp., így le is dörgöltem a gépről mihamarabb :)), én két veszélyes pontot látok:
    – ReferenceEqueals nem lehet, hogy ő vissza hív az object-es Equals-ba v. a másikba pl.? (Reflector mit mutat?), no meg nem ismervén a ReferenceEquals-t, de az nem fordulhat elő (ez egy másik hiba lehetőség), hogy két (eltérő objektumban single nav prop.) ugyanarra mutató reference-re false-t ad vissza?
    – GetHashCode: ennek ugye nem mindig ua.-t kellene vissza adnia? mert itt attól függően hogy be van-e töltve vagy se, eltérő értéket fog visszaadni mintha.

  • Soczó Zsolt January 14, 2013

    A 2. tipp közel van, ott van valami gond.

  • hrongyorgy January 15, 2013

    Szerintem az Equals kerul vegtelen ciklusba, mert onmagat hivja. Sosem volt erossegem a C#, de nem kellene oda valami BaseEntity.Equals szeru hivas?

  • Soczó Zsolt January 15, 2013

    Nem, nem ettől áll be.

  • Ákos January 17, 2013

    Multithreading probléma lesz ez?

  • Soczó Zsolt January 17, 2013

    Nem, homlokcsapkodósan egyszerű. Hétvégén megírom, ha nem jön jó válasz.

  • Ákos January 18, 2013

    Az úgy nem lenne jó, ha csak plusz infót írnál, hogy legalább részben meglegyen a felfedezés öröme?

  • Soczó Zsolt January 19, 2013

    Az equals és a gethashcode között van valami összefüggés a CLR doksi szerint, ezzel van itt gond.

  • SzikiG January 19, 2013

    Mi van akkor, ha az Id == 0 ?
    Szerintem ekkor áll be a dolog.

    Szerintem a ReferenceEquals meg az Equals a fenti kódban lazán egymást hívogatják.

  • Soczó Zsolt January 19, 2013

    Nem, a HashSet.Add kerül végtelen ciklusba, nem az én kódom. De az enyém logikai hibája okozza ezt.

  • Soczó Zsolt January 20, 2013

    De SzikiG nem jár messze.

  • Ákos January 24, 2013

    4-es CLR-ben is előjön ez?

  • Soczó Zsolt January 24, 2013

    Igen, 4.5-ben jött elő.

  • Ákos January 31, 2013

    Nem tudtunk sajnos rájönni, h hogyan lehet reprodukálni

  • Soczó Zsolt February 1, 2013

    Leírom majd pontosan az okokat, csak most nincs rá időm alaposan kivesézni, jövő hét…

  • Ákos February 8, 2013

    Izgatottan várjuk!