Во-первых, как я думаю, вы понимаете, где бы вы ни внедрили Equals
, вы ДОЛЖНЫ также реализовать GetHashCode
.Реализация GetHashCode
должна отражать поведение реализации Equals
, но обычно не используется .
См. http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx - особенно "Примечания кРеализаторы "
Итак, если вы берете пример реализации Item
Equals
, вы рассматриваете оба значения id
и name
, чтобы повлиять на равенство.Таким образом, оба из них должны внести свой вклад в реализацию GetHashCode
.
Пример того, как вы могли бы реализовать GetHashCode
для Item
, будет выглядеть следующим образом (обратите внимание, что вам может потребоваться сделать его эластичнымобнуляемое поле name
:
public override GetHashCode()
{
return id.GetHashCode() ^ name.GetHashCode();
}
См. сообщение Эрика Липперта в блоге о рекомендациях для GetHashCode
- http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/
Что касается необходимости повторной реализации GetHashCode
в подклассах - Да, если вы также переопределите Equals
- согласно первому (и главному) пункту - реализация двух должна быть согласованной - если два элемента считаются равными Equals
, то они должны возвращать одно и то же значение изGetHashCode
.
Примечание: как улучшение производительности вашего кода (избегайте многократных приведений):
if ( obj is Param){
Param p = (Param)(obj);
Param p = obj as Param;
if (p != null) ...