收藏 分销(赏)

许多人头痛过的C#GetHashCode()方法详解.doc

上传人:xrp****65 文档编号:5897130 上传时间:2024-11-22 格式:DOC 页数:4 大小:39.50KB 下载积分:10 金币
下载 相关 举报
许多人头痛过的C#GetHashCode()方法详解.doc_第1页
第1页 / 共4页
许多人头痛过的C#GetHashCode()方法详解.doc_第2页
第2页 / 共4页


点击查看更多>>
资源描述
+ ( Figure 1-1) ( Figure 1-1)所示,对于实现 hash算法的集合,如 HashSet<T>,假设会将 hash值对应的区域分为"32"个区域,集合在寻找对象的时候,首先,会根据自身的 hashcode % 32,所得的值去相对于的区域寻找对象.这显然提高了查询的效率. 当然,对于没有实现 hash算法的集合,实现GetHashCode()方法是没有意义的. 话说回来,为什么在许多情况下,当我们重写了 Equals()方法时,编译器会提示我们同时也重写 GetHashCode()方法? 试想,当我们去添加一个对象(此时我们只是重写了 Equals()方法,没有重写GetHashCode()方法),这时会有两种情况,其一是在"已有"和当前对象相同的区域寻找,此时,因为对象重复,无法添加(因为我们重写了Equals()方法); 其二,不在那个区域查找,也就是说,在两个不同的区域查找,此时可以再添加(因为在不同的区域查找. 所以说,很多时候,编译器会提示我们在重写Equals ()方法的时候,同时也重写GetHashCode()方法.从这里也可以看出,对于没有实现 hash算法的集合,重写GetHashCode()方法是没有意义的.(因为只有 hash算法才将其分域). class Point { private int _x; //横坐标. public int X { get { return _x; } set { _x = value; } } private int _y; //纵坐标. public int Y { get { return _y; } set { _y = value; } } public Point(int x, int y) { this._x = x; this._y = y; } //override the Object's Equals() Method. public override bool Equals(object obj) { if(obj == null) throw new NullReferenceException("Point"); Point another = obj as Point; return this._x == another._x && this._y == another._y; } //override the Object's GetHashCode() Method. public override int GetHashCode() { return X.GetHashCode() ^ Y.GetHashCode(); } } //Program类Main方法中: class Program { static void Main(string[] args) { //HashSet(实现hash算法). HashSet<Point> points = new HashSet<Point>(); Point p1 = new Point(1,1); Point p2 = new Point(2,2); Point p3 = new Point(3,3); points.Add(p1); points.Add(p2); points.Add(p3); Console.WriteLine(points.Count); //添加重复值的Point. Point p4 = new Point(2, 2); points.Add(p4); Console.WriteLine(points.Count); //Point类未重写自己的 GetHashCode()方法事,output: 4. //Point类重写自己的 GetHashCode()方法后, output: 3. p1.X = 0; //修改参与计算hash值的字段. points.Remove(p1); //如果没有"修改参与计算hash值的字段",output 2; //否则 output: 3 (即无法删除). Console.WriteLine(points.Count); Console.ReadKey(); } } 如上测试,在Main方法中,我们对一个对象(p1)存储到hash集合后,去修改参与hash计算的字段(我们在Point的重写 GetHashCode()方法涉及到 X字段),发现无法删除. 注意,当一个对象存储到 hash集合后,就不能修改这个对象中参与计算的hash字段了;否则,对象修改后的hashcode与最初存储进hash集合中的hashcode就不同了. 在这种情况下,即使在 Contains()方法使用该对象的当前引用作为参数区hash集合中检索对象也无法找到对象.这也会导致无法从hash集合中单独删除当前对象,从而造成内存泄露
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 行业资料 > 医学/心理学

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服