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
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.
A 2. tipp közel van, ott van valami gond.
Szerintem az Equals kerul vegtelen ciklusba, mert onmagat hivja. Sosem volt erossegem a C#, de nem kellene oda valami BaseEntity.Equals szeru hivas?
Nem, nem ettől áll be.
Multithreading probléma lesz ez?
Nem, homlokcsapkodósan egyszerű. Hétvégén megírom, ha nem jön jó válasz.
Az úgy nem lenne jó, ha csak plusz infót írnál, hogy legalább részben meglegyen a felfedezés öröme?
Az equals és a gethashcode között van valami összefüggés a CLR doksi szerint, ezzel van itt gond.
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.
Nem, a HashSet.Add kerül végtelen ciklusba, nem az én kódom. De az enyém logikai hibája okozza ezt.
De SzikiG nem jár messze.
4-es CLR-ben is előjön ez?
Igen, 4.5-ben jött elő.
Nem tudtunk sajnos rájönni, h hogyan lehet reprodukálni
Leírom majd pontosan az okokat, csak most nincs rá időm alaposan kivesézni, jövő hét…
Izgatottan várjuk!