2013-08-11 5 views
3

Я использую Entity Framework 5. В моем коде C# я хочу сравнить, если два объекта равны. Если нет, то я хочу выпустить обновление.Почему я должен переопределять .Equals и GetHashCode в C#

Мне сказали, что мне нужно переопределить метод .Equals, а затем также метод getascode. Мои классы выглядеть следующим образом:

public class Students { 
    public int PersonId { get; set; } 
    public string Name { get; set; } 
    public int Age {get; set;} 
} 

Может кто-нибудь объяснить, почему мне нужно переопределить .equals и .GetHashCode. Также может кто-нибудь дать мне пример. В частности, я не уверен в хэш-коде. Обратите внимание, что мой PersonId является уникальным номером для этого класса.

+3

http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when-equals -method-is-overridden –

+0

@Melina вы много раз просили в комментариях, почему вам нужно переопределить 'GetHashCode'. Пожалуйста, прочитайте ответы на вопрос, связанный с @CodeIgnoto с *. –

ответ

3

вам необходимо переопределить два по любым причинам. Например, HashCode используется для словаря и хеш-таблиц, например. равные используются для любого сравнения, которое вы делаете в структурах данных, таких как метод Содержит. пример:

public partial class myClass 
{ 
    public override bool Equals(object obj) 
    { 
    return base.Equals(obj); 
    } 

    public override int GetHashCode() 
    { 
    return base.GetHashCode(); 
    } 
} 

для хэш-код я сделал бы:

public int GetHashCode() 
    { 
    return PersonId.GetHashCode()^
      Name.GetHashCode()^
      Age.GetHashCode(); 
    } 
+0

Я думаю, он сказал, что идентификатор уникален^ –

+0

Да Идентификатор уникален. Могу ли я просто использовать это для хэш-кода и почему мне нужно создать GetHashCode. Как он используется? – Melina

+0

@Melina, если вы используете hashTable, словарь или некоторые другие вещи, тогда GetHashCode вызывается для получения хэша класса. вы можете делать хэширование только с id, но это ваш выбор, я бы сделал хэширование для всех членов, но это не обязательно, если идентификатор действительно уникален. –

2

Классы являются ссылочными типами. Когда вы создаете два объекта и сохраняете их в переменных, вы сохраняете только ссылку на них. Это означает, что если вы попытаетесь сравнить их, вы будете сравнивать только две ссылки, которые будут равны, если они указывают на один и тот же объект в куче. Если вы хотите изменить это поведение, вам придется переопределить Equals.
Также некоторые коллекции зависят от GetHashCode для хранения элементов в древовидных (или любых других) структурах, которым нужны некоторые средства сравнения между двумя объектами данного класса. Вот почему вам необходимо реализовать эти методы, если вам нужно, чтобы ваш определенный класс правильно вел себя в указанных обстоятельствах.
Типичная реализация GetHashCode будет xor полей класса, которая задана в ответе @No Idea For Name. Но так как PersonId уникален в вашем примере, вы можете также использовать что:

public int GetHashCode() 
{ 
    return PersonId.GetHashCode(); 
} 
+0

Спасибо. Теперь я понимаю. Что касается GetHashCode. Зачем это нужно? Как вы рекомендуете мне его кодировать, когда мой идентификатор уникален? – Melina

+0

@Melina, такой же причина. Реализация по умолчанию «GetHashCode» (для объектов) по умолчанию основана на сравнении ссылок.Как правило, «GetHashCode» должен демонстрировать то же поведение, что и «Equals» (несмотря на хеш-коллизии). – harpo

+0

@Melina вы просто возвращаете хэш-код PersonId. И я считаю, что я уже объяснил, почему это нужно переопределить. Если это пока неясно, будьте конкретны. – atoMerz

Смежные вопросы