• .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

  • 相关阅读:
    (笔记)电路设计(十三)之振荡电路的应用
    (笔记)电路设计(十二)之高速数字系统滤波电容的设计应用
    爬楼梯问题 leetcode70
    偏函数
    柯里化
    插入排序
    选择排序
    冒泡排序
    解包(封装和解构)、丢弃变量
    数据类型之集合
  • 原文地址:https://www.cnblogs.com/jesselzj/p/4797603.html
Copyright © 2020-2023  润新知