按照MSDN中对 GetHashCode()函数的说明:如果两个类型相同的对象表示相同的值,则哈希函数必须为两个对象返回相同的常数值。
为了获得最佳性能,哈希函数必须为所有输入生成随机分布。
不论对该对象进行什么样的更改,哈希函数都必须返回完全相同的值。
但我的类Font的两个实例f1和f2 GetHashCode()的结果确不一样为什么,代码如下:    enum Color { Red, Blue }    class Font //: Object//(12bytes+8bytes=20bytes)*n
    {
        string fontName;//4bytes
        int size;//4bytes
        Color color;//4bytes        public Font(string FontName, int Size,Color PColor)
        {
            fontName = FontName;
            size = Size;
            color = PColor;
        }
    }    class Program
    {
        static void Main(string[] args)
        {
            Font f1 = new Font("宋体", 5, Color.Red);
            Font f2 = new Font("宋体", 5, Color.Red);            int b1=f1.GetHashCode();
            int b2=f2.GetHashCode();
        }
    }

解决方案 »

  1.   

    要注意值类型和引用类型的区别..
    上头的说明只对值类型有效...把代码换成这个试试
    int   f1   =  1;                        int   f2   =  1;
                            int   b1=f1.GetHashCode(); 
                            int   b2=f2.GetHashCode(); 
      

  2.   

    你可以这样去断言:
    AssertIf(object1 == object2, object1.GetHashCode() == object2.GetHashCode());HashCode在两个对象相等的时候应给得到同样的HashCode,当两个对象不等时一般都会返回不同的HashCode楼主new出来的两个Font对象是不相等的,当然会得到不同的hash
    一楼的例子可以说明
      

  3.   

    在说一下...
    楼主new出来的两个Font对象是不相等的,当然会得到不同的hash 
    一楼的例子可以说明
    实际不等的是保存对象的内存地址..
    如果LZ希望得到相等的GetHashCode()可以重写这个方法..
    简单有效的可以这样写..return  (fontName.ToString()+size.ToString()+color.ToString()).GetHashCode();
                           
      

  4.   

    return     (fontName.ToString()+size.ToString()+color.ToString()).GetHashCode(); 
    三楼这个办法我用了,但也有可能正好碰到不同的值加起来一样(虽然概率非常小)。
    想再问个问题,就是有没有更严密的办法判断f1 f2 两个对象是相等的
      

  5.   

    或者说更严密的办法 重写 GetHashCode()方法,保证相同的对象的hashCode一样,不同的对象hashCode一定不同