.NET基础 (11)类型的基类System.Object

类型的基类System.Object
1 是否存在不继承自System.Object类型的类
2 在System.Object中定义的三个比较方法有何异同
3 如何重写GetHashCode方法

 

类型的基类System.Object
1 是否存在不继承自System.Object类型的类

 通过运行ILasm.exe的noautoinherit开关,可以生产不从System.Object继承的类型,这种类型是不安全的类型,也不建议使用。


2 在System.Object中定义的三个比较方法有何异同

静态方法ReferenceEquals实现了引用比较。

静态Equals方法实现了比较高效地调用实例Equals方法的功能。

实例Equals方法是一个虚方法,默认实现的是引用比较,类型可以根据需要重写Equals方法。值类型的基类ValueType重写了Equals方法,实现了内容比较。


3 如何重写GetHashCode方法

 Object中GetHasCode的算法保证了同一对象返回同一HashCode,而不同的对象返回不同的HashCode,但对于值类型等视内容相等的对象为相等对象的类型时,默认的GetHashCode算法并不正确。重写后的GetHashCode必须要保证同一对象无论何时都返回同一HashCode值,而相等的对象也必须返回相同的值。并且在此基础上,保证HashCode尽量随机地散列分布。

示例:

    sealed class OverrideGetHashCode
    {
        public int _MyInt;
        //只读成员
        public readonly String _MyString;

        //重写了Equals方法
        public override bool Equals(object obj)
        {
            // 检查空引用
            if (obj == null)
                return false;
            //做引用比较,如果两者引用相等,势必内容相等
            if (Object.ReferenceEquals(this, obj))
                return true;
            if (this.GetType() != obj.GetType())
                return false;
            // 实现内容比较
            OverrideGetHashCode right = obj as OverrideGetHashCode;
            if (_MyInt == right._MyInt && _MyString == right._MyString)
                return true;
            return false;

        }
        public OverrideGetHashCode(int i, String s)
        {
            _MyInt = i;
            _MyString = s;
        }
        //重写了 GetHashCode方法
        public override int GetHashCode()
        {
            //依靠只读成员的HashCode
            return _MyString.GetHashCode();
        }
        static void Main(string[] args)
        {
            //验证相等的对象返回相等的HashCode
            OverrideGetHashCode o1 = new OverrideGetHashCode(10, "我是字符串");
            OverrideGetHashCode o2 = new OverrideGetHashCode(10, "我是字符串");
            Console.WriteLine("对象是否相等:" +o1.Equals(o2));
            Console.WriteLine("相等对象HashCode是否相等" +
                (o1.GetHashCode() == o2.GetHashCode()).ToString());

            //验证同一对象返回相等的HashCode
            int code = o1.GetHashCode();
            o1._MyInt = 12;
            Console.WriteLine("同一对象HashCode是否相等:" +
                          (o1.GetHashCode() == code).ToString());

            Console.Read();
        }
    }

 

输出:

对象是否相等:True
相等对象HashCode是否相等True
同一对象HashCode是否相等:True

 

 

转载请注明出处:

作者:JesseLZJ
出处:http://jesselzj.cnblogs.com

posted @ 2015-09-10 15:17  JesseLZJ  阅读(780)  评论(0编辑  收藏  举报