重写类上的GetHashCode(),Equals()方法。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重写类上的GetHashCode(),Equals()方法。相关的知识,希望对你有一定的参考价值。

Why? So that your class can be used with collection classes.

// basic class

Every object has a GetHashCode() and Equals() method by default which it inherits from Object. Unfortunately these methods are useless as they stand because they say nothing specific about the class. As is, two objects of type MyStuff will only ever be equal if they are the same object (point to the same reference), making them of no use with collections.

// useful class

Add GetHashCode(), Equals() methods so that you can use the class with the Contains() method and other methods of IEnumerable collections.

I stole this from Jonathan McCracken: Test-Drive ASP.NET MCV
  1. // basic class
  2. public class MyStuff {
  3. public int Id { get; set; }
  4. public string Name { get; set; }
  5. public int MyValue { get; set; }
  6. }
  7.  
  8. // useful class
  9. public class MyStuff {
  10. public int Id { get; set; }
  11. public string Name { get; set; }
  12. public int MyValue { get; set; }
  13.  
  14. public override int GetHashCode(){
  15. return Id;
  16. }
  17.  
  18. public override bool Equals(object obj){
  19. if (ReferenceEquals(this, obj)) return true;
  20. if (obj.GetType() != typeof (MyStuff)) return false;
  21.  
  22. var other = obj as MyStuff;
  23.  
  24. return (other.Id == Id
  25. && other.MyValue == MyValue
  26. && other.Equals(other.Name, Name));
  27. // use .Equals() here to compare objects; == for Value types
  28.  
  29. // alternative weak Equals() for value objects:
  30. // return (other.MyValue == MyValue && other.Equals(other.Name, Name) );
  31. }
  32. }

以上是关于重写类上的GetHashCode(),Equals()方法。的主要内容,如果未能解决你的问题,请参考以下文章

dotnet C# 基础 为什么 GetHashCode 推荐只取只读属性或字段做哈希值

为啥我需要覆盖 C# 中的 .Equals 和 GetHashCode [重复]

对象哈希码

C#GetHashCode() 高性能散列算法 [重复]

dotnet C# 实现 GetHashCode 的方法

未调用 C#GetHashCode/Equals 覆盖