.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

时间: 2024-10-08 12:58:10

.NET基础 (11)类型的基类System.Object的相关文章

ES 服务器 索引、类型仓库基类 BaseESStorage

/******************************************************* * * 作者:朱皖苏 * 创建日期:20180508 * 说明:此文件只包含一个类,具体内容见类型注释. * 运行环境:.NET 4.0 * 版本号:1.0.0 * * 历史记录: * 创建文件 朱皖苏 20180508 14:00 * *******************************************************/ using DBEN.Basic.

C#基础[11] 文件管理(File类)

基本操作:判存.复制.移动.删除基本方法:File.Exist();File.Copy();File.Move();File.Delete() 补充:文本文件编码,文本文件有不同的存储方式,将字符串以什么样的形式保存为二进制,这个就是编码,UTF-8.ASCII.Unicode,gbk gb2312等,如果出现乱码一般就是编码的问题,文本文件相关的函数一般都有一个Encoding类型的参数,取得编码的方式:Encoding.Default.Encoding.UTF8.Encoding.GetEn

C# 类型基础 值类型和引用类型

引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复制(Shallow Copy)和深度复制(Deep Copy),浅度复制和深度复制又是以如何复制引用类型成员来划分的.由此又引出了引用类型和值类型,以及相关的对象判等.装箱.拆箱等基础知识.索性从最基础的类型开始自底向上写起. 值类型和引用类型 先简单回顾一下C#中的类型系统.C# 中的类型一共分为

Object基类

知识点 值类型. 值类型是在栈中分配内存,在声明时初始化才能使用,不能为null. 值类型超出作用范围系统自动释放内存. 主要由两类组成:结构,枚举(enum),结构分为以下几类: 整型(Sbyte.Byte.Char.Short.Ushort.Int.Uint.Long.Ulong) 浮点型(Float.Double) decimal bool 用户定义的结构(struct) 引用类型. 引用类型在堆中分配内存,初始化时默认为null. 引用类型是通过垃圾回收机制进行回收. 包括类.接口.委托

System.Object 基类

System.Object 基类 System.Object在.Net中是所有类型的基类,任何类型都直接或间接地继承自System.Object.没有指定基类的类型都默认继承于System.Object. 基类特性 正由于所有的类型都继承于System.Object.因此,所有的类型都具有下面这些特性: GetType()方法,获取对象的类型. Equals.ReferenceEquals和==,判断对象是否相等. ToString()方法,获取对象的字符串信息,默认返回对象带命名空间的全名.

第4章 类型基础 -- 4.1 所有类型都从System.Object派生

4.1 所有类型都从System.Object派生 “运行时”要求每个类型最终都从System.Object类型派生. 由于所有类型最终都从System.Object派生,所以每个类型的每个对象都保证了一组最基本的方法. System.Object类提供了如下表所示的公共实例方法: 表4-1 System.Object的公共方法 Equals 若两个对象具有相同的值,就返回 true .详情请参考"对象相等性和同一性" GetHashCode 返回对象的值的哈希码.如果某个类型的对象要

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

分析问题 可能读者的固有思维认为.NET中所有的类型都必须继承自System.Object,这样的认识过于绝对,且不完全正确.在.NET中,.NET设计小组为中间语言的编译器ILasm.exe添加了noautoinherit开关,当这个开关被打开时,编译器将不会默认年地把类型认为继承自System.Object. 首先介绍一下中间语言的编译工具:ILasm.exe.这是.NET Framework提供的一个编译工具,它的作用是把中间语言(MSIL)编译成可执行的PE文件.该工具非常有用,它不仅使

Java基础12:深入理解Class类和Object类

Java基础12:深入理解Class类和Object类 Java中Class类及用法 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的RTTI. 这项信息纪录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类.Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建. 说白了就是: Class类也是类的一种,只是名字和class关键字高度相似.Java是大小写敏感的语言.

夯实Java基础系列9:深入理解Class类和Object类

目录 Java中Class类及用法 Class类原理 如何获得一个Class类对象 使用Class类的对象来生成目标类的实例 Object类 类构造器public Object(); registerNatives()方法; Clone()方法实现浅拷贝 getClass()方法 equals()方法 hashCode()方法; toString()方法 wait() notify() notifAll() finalize()方法 CLass类和Object类的关系 参考文章 微信公众号 Ja