为什么覆写了Equals,还要覆写GetHashCode呢

如果你传递给Hashtable的key是Class,而如何保证key的唯一呢??因为Hashtable还是用到了HashCode做为验证唯一性,所以你还要在你的类覆写GetHashCode(),并且也要重写Equals()以判断是否相等..具体问题可以看 给你的类重写Equals--检测Class是否相等 .基础的东西这里都有说明

现在来看Hashtable的具体实现,首先你添加一对键/值后,会将键和对象的引用放入存储桶,Hashtable的键索引是按key对象的GetHashCode方法计算的,查找的时候也是用查找的键与存储的键对比,对比的方法还是要依赖Equals!!这个过程也说明了,为什么覆写了GetHashCode之后也要覆盖Equals了..看代码:
 1 None.gif // =============  用户类   ==================
 2 None.gif public   class  User
 3 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 4InBlock.gif    private string name = null;
 5InBlock.gif    public User(string name)
 6ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 7InBlock.gif        this.name = name;
 8ExpandedSubBlockEnd.gif    }

 9InBlock.gif    
10InBlock.gif    public override string ToString()    //覆写ToString()
11ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
12InBlock.gif        return name;
13ExpandedSubBlockEnd.gif    }

14InBlock.gif    
15InBlock.gif    //这里因为name是不重复的,所以获取name的HashCode,作为
16InBlock.gif    public override int GetHashCode()    
17ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
18InBlock.gif        return ToString().GetHashCode();
19ExpandedSubBlockEnd.gif    }

20InBlock.gif    
21ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//// <summary>
22InBlock.gif    ///        覆写Equals,判断对象是否具有相同的
23InBlock.gif    /// </summary>
24InBlock.gif    /// <param name="obj"></param>
25ExpandedSubBlockEnd.gif    /// <returns></returns>

26InBlock.gif    public override bool Equals(object obj)
27ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
28InBlock.gif        User u = obj as User;    
29InBlock.gif        if ( u == null )            //如果不能转换为当前Class,则返回false
30InBlock.gif            return false;
31InBlock.gif        if ( this.name == u.name && this.ToString() == u.ToString() )
32InBlock.gif            return true;
33InBlock.gif        
34InBlock.gif        return false;
35ExpandedSubBlockEnd.gif    }

36InBlock.gif    
37ExpandedBlockEnd.gif}

38 None.gif
39 None.gif //  ============  对应用户的信息  ==============
40 None.gif public   class  UserInfo
41 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
42InBlock.gif    private User u;
43InBlock.gif    public UserInfo(User us)
44ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
45InBlock.gif        this.u = us;
46ExpandedSubBlockEnd.gif    }

47InBlock.gif    
48InBlock.gif    public override string ToString()
49ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
50InBlock.gif        return u.ToString() + "的信息";
51ExpandedSubBlockEnd.gif    }

52InBlock.gif    
53ExpandedBlockEnd.gif}

54 None.gif
55 None.gif // ==========  测试代码 Main  ==================
56 None.gif static   void  Main( string [] args)
57 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
58InBlock.gif    User u1 = new User("小李");
59InBlock.gif    User u2 = new User("小王");
60InBlock.gif    UserInfo info1 = new UserInfo(u1);
61InBlock.gif    UserInfo info2 = new UserInfo(u2);
62InBlock.gif    System.Collections.Hashtable hs = new System.Collections.Hashtable();
63InBlock.gif    
64InBlock.gif    hs.Add( u1,info1 );
65InBlock.gif    hs.Add( u2,info2 );
66InBlock.gif    
67InBlock.gif    User u3 = new User("小李");
68InBlock.gif    UserInfo info3 = new UserInfo(u1);
69InBlock.gif    User u4 = new User("小王");
70InBlock.gif    
71InBlock.gif    Console.WriteLine( hs[u3] );
72InBlock.gif    Console.WriteLine( hs[u4] );
73ExpandedSubBlockStart.gifContractedSubBlock.gif    try dot.gif{
74InBlock.gif        hs.Add( u3, info3);
75ExpandedSubBlockStart.gifContractedSubBlock.gif    }
catch(ArgumentException ee) dot.gif{
76InBlock.gif        Console.WriteLine( ee.Message );
77ExpandedSubBlockEnd.gif    }

78InBlock.gif    
79ExpandedBlockEnd.gif}

上面的代码实例化了四个类,其中两个小王,两个小李,先添加小李1和小王1到Hashtable中,然后用新的小王2和小李2进行查找Hashtable,因为作为键的User类重写了GetHashCode和Equals,并且实例的时候也都是用的小王和小李,并且他们的string.GetHashCode是一样的..所以会被找到...最后程序又试图添加小李2到Hashtable中,但是因为里面已经存在了一个相同的key.GetHashCode,所以添加导致了异常...上面的输出结果是:
1 None.gif 小李的信息
2 None.gif小王的信息
3 None.gif已添加项。字典中的键: “小李”  所添加的键: “小李”
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值