Реалізація методу EqualsQ в Visual C # (Sharp)

Вихідний код для реалізації методу Equals () виглядає таким чином:

public override bool Equals(object obj) { if (obj is HashcodeExample) {

return objGetHashCode() == thisGetHashCode()

}

else {

return false

}

}

Так як правило для методу GetHashCode () говорить, що два обєкти, що мають одаковие значення хеш-коду, повинні повертати одне і те ж значення, то може здатися, що має сенс використовувати його для реалізація методу Equals () Але удавана хорошою ідея насправді виявляється поганий, як показано в наступному прикладі:

String si = &quotHello" String s2 = &quotWorld"

int xl = 17 * 17 + siGetHashCode() int x2 = 17 * 17 + s2GetHashCode()

HashCodeExample hi = new HashCodeExample(x2 * 37, si) HashCodeExample h2 = new HashCodeExample(xl * 37, s2)

Hashtable ht = new Hashtable() htAdd(hl, null)

htAdd(h2, null)

Як можна бачити, два обєкти з повністю різними станами видають одінова значення хеш-коду, що викликає виключення, т к метод Equals () реалізан неправильно У реалізації Hashtable, коли є колізія доданого обєкта з іншим, вже існуючим обєктом, виконується перевірка на раветво обєктів У разі позитивного результату перевірки генерується іскленіе, т к Hashtable не дозволяє додавати обєкт з таким же станом, як і стан іншого обєкта

Рішенням буде не виправляти метод GetHashCode (), але модифікувати метод

Equals():

public override bool Equals(object obj) { if (obj is HashCodeExampleWorking) {

i f (objGetHashCode() = thi sGetHashCode()) return false

‘/ / Потрібно зробити:

/ / 1 Поелементне порівняння – важке, не універсальна робота HashCodeExampleWorking toTest = obj as HashCodeExampleWorking if (toTestval == thisval) {

if( toTestbuf == thisbuf) { return true

‘ }

}

/ / Або

/ / 2 Порівняння з відображенням

12 Зак 555

II або

/ / 3 Порівняння результатів метола ToString ():

. / / Що якщо метол не підміняти чи це має бути стандартною

/ / Практикою зразок методів GetHashCode () і Equals ()

}

return false

}

Реалізована в методі Equals про логіка спочатку тестує обидва типи на ідентіость У разі негативного результату повертається false Далі виконується перевірка на повернення методом GetHashCode () неоднакових значень Метод GetHashCode про завжди повинен повертати різні значення для обєктів, що мають різні члени даних Якщо ж значення хеш-кодів однакові, то слует важка робота індивідуального тестування кожного члена даних на ренство Цей крок залишається наостанок, т к будь-який обєкт, що досягли цієї стадії, швидше за все, буде ідентичний вже існуючого обєкта, але нам потрібно бути впевненими на всі 100%

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*