2010-11-04 3 views

ответ

2

Все классы, чтобы наследовать это от System.Object.

Если вам нужно предоставить определенный Equals или GetHashCode для класса, вы должны переопределить методы в своих классах. В противном случае просто оставить их ..

http://msdn.microsoft.com/en-us/library/system.object.gethashcode(v=VS.71).aspx

10

Нет, они уже делают.

Следует ли им переопределять их, зависит от того, как он будет использоваться. В большинстве случаев это не требуется.

3

Все классы уже наследуют эти методы из базового класса System.Object.

Вы можете переопределить методы в производных классах, если вам нужно сравнить два экземпляра объекта за пределами простого ссылочного равенства, в противном случае это необязательно.

Помните, однако, что если вы решите переопределить одну из них, вам также необходимо переопределить другую, чтобы гарантировать, что Hashtables и словарные ключи, между прочим, работают правильно с вашим производным классом. Метод GetHashCode должен отражать ту же логику, что и метод Equals. Смотрите здесь для более подробных разъяснений и примеров:

http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx

и

http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx

+0

См. Также: http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when-equals-method-is-overriden-in-c –

0

Может быть, не все, но все классы, которые будут помещены в какой-то мешок (IList, ICollection, IDictionary , Hashset и т. Д.) И нужен простой метод для их дифференциации (просто подумайте о Sort(), Contains(), BinarySearch() и т. Д.).

Если вы используете класс таким образом, вы должны обязательно их реализовать правильно.

0

Когда вы переопределяете Equals, в основном. Если вы хотите представить другую идею равенства, отличную от простой ссылки .

Строка является хорошим примером этого - две строк равны (при простом Равно вызова), если они представляют собой же последовательность символов. Код хэша отражает это, так что если две строки равны, они будут иметь один и тот же хэш-код . (Реверс не обязательно true - две неравные строки могут иметь одинаковый хэш-код, но это маловероятно.)

(Strings хитры другими способами, учти - есть много различных идей равенства на основе культуры и корпуса, но String.Equals выглядит в точках UTF-16 кодов, которые делают вверх по строка, и сравнивает их в простейшей мыслимой моды)

by Jon Skeet

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