关于equal hashcode 重写

 

项目master:

        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")]);

        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值