public static bool operator ==(MasterBase a, MasterBase b) {
if (Object.ReferenceEquals(a, b)) {
return true;
}
if (!Object.ReferenceEquals(a, null) && !Object.ReferenceEquals(b, null)
&& a.GetType() == b.GetType()
&& a.CompanyCode == b.CompanyCode && a.Code == b.Code) {
return true;
}
return false;
}
public static bool operator !=(MasterBase a, MasterBase b) {
return !(a == b);
}
public override int GetHashCode() {
return
(this.CompanyCode == null ? 0 : this.CompanyCode.GetHashCode()) * 17 +
(this.Code == null ? 0 : this.Code.GetHashCode());
}
public override bool Equals(object obj) {
return this == obj as MasterBase;
}
哈希代码是一个用于在相等测试过程中标识对象的数值。 它还可以作为一个集合中的对象的索引。
.NET Framework 不保证 GetHashCode 方法的默认实现以及它所返回的值在不同版本的 .NET Framework 中是相同的。 因此,在进行哈希运算时,该方法的默认实现不得用作唯一对象标识符。
哈希函数必须具有以下特点:
如果两个对象的 Equals 比较结果相等,则每个对象的 GetHashCode 方法都必须返回同一个值。 但是,如果两个对象的比较结果不相等,则这两个对象的 GetHashCode 方法不一定返回不同的值。
一个对象的 GetHashCode 方法必须总是返回同一个哈希代码,但前提是没有修改过对象状态,对象状态用来确定对象的 Equals 方法的返回值。请注意,这仅适用于应用程序的当前执行,再次运行该应用程序时可能会返回另一个哈希代码。
为了获得最佳性能,哈希函数必须为所有输入生成随机分布。
从特点一能够得出第一个问题的答案,Object中的Equals方法只是简单判断两个对象是不是引用同一个对象,而由于Object中没有任何实例字段GetHashCode方法返回的哈希码能作为全局唯一的标识,但是值类型基类的GetHashCode方法则使用了反射,效率也比较低。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace RemoveDemo
{
public class Product
{
private string id = string.Empty ;
public Product(string id)
{
this.id = id;
}
public static Product GetProduct(string id)
{
return new Product(id);
}
//equals 的标准重写方式
public override bool Equals(System.Object obj)
{
// If parameter is null return false.
if (obj == null)
{
return false;
}
// If parameter cannot be cast to Point return false.
Product p = obj as Product;
if ((System.Object)p == null)
{
return false;
}
// Return true if the fields match:
return this.id == p.id;
}
public static bool operator ==(Product product1, Product product2)
{
// If both are null, or both are same instance, return true.
if (System.Object.ReferenceEquals(product1, product2))
{
return true;
}
// If one is null, but not both, return false.
if (((object)product1 == null) || ((object)product2 == null))
{
return false;
}
// Return true if the fields match:
return product1.id == product2.id;
}
public static bool operator !=(Product product1, Product product2)
{
// Return true if the fields match:
return product1 != product2;
}
public override int GetHashCode()
{
return this.id.GetHashCode() ;
}
}
}
namespace RemoveDemo
{
class Program
{
static void Main(string[] args)
{
Product p1 = new Product("1001");
Product p2 = new Product("1002");
//如果把引用类型作为Key值,那么必须对GetHashCode方法进行重写,否则会出错,如果不用做key值,那么无所谓重写不重写
Dictionary<Product, int> dict = new Dictionary<Product, int>();
dict.Add(p1, 1);
dict.Add(p2, 2);
Console.Write (dict[new Product ("1001")]);
}
}
}