רובנו מכירים את הטיפוס של Dictionary המאפשר לנו לבצע מיפוי בין Instanceים מסוג אחד לInstanceים מסוג אחר.
טיפוס זה מאוד חזק ומקל עלינו את האפשרות לבצע תהליכים תכנותיים סבוכים.
אחת הטעויות הנפוצות היא לתת לDictionary בתור הKey אובייקט שהוא Mutable. (כלומר, אובייקט שהוא בר שינוי)
למה?
יש לזה מספר סיבות: הסיבה העיקרית היא שDictionary ממפהInstance בודד לInstance בודד אחר.
עכשיו, נניח שמיפינו שני אובייקטים שונים, כל אחד לInstance אחר בDictionary:
זה האובייקט שלנו (הEquals באדיבות הReShaper)
|
|
ויצרנו שני מיפויים:
|
|
עכשיו שינינו את אחד הmutable:
|
|
עכשיו מה שקורה בעצם זה שיש לנו בDictionary את אותו Key ביחס לEquals פעמיים. במצב זה לא ברור איזה ערך אנחנו מצפים שיחזור.
סיבה נוספת היא המימוש הפנימי של Dictionary: Dictionary משתמש בGetHashCode וEquals כדי לאתר איברים בו.
במידה והGetHashCode שלנו הוא לא קונסיסטנטי עם הEquals, ייתכן שהDictionary שלנו לא יצליח למצוא את הKey, למרות שהוא נמצא בו. הדבר הזה יכול לקרות אם הGetHashCode מתבסס על דברים שהם לא Immutable!
לכן כשאתם כותבים מחלקה שאתם מעוניינים שתהיה Key של Dictionary, תדאגו שהיא תהיה Immutable.
אם אתם לא רוצים לממש לה GetHashCode וEquals זה גם בסדר, אתם יכולים לספק IEqualityComparer לDictionary שמשווה את האובייקטים בצורה נכונה.
חג שמח, בלי שינויים לא שגורים!