类型的基类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(, "我是字符串");
OverrideGetHashCode o2 = new OverrideGetHashCode(, "我是字符串");
Console.WriteLine("对象是否相等:" +o1.Equals(o2));
Console.WriteLine("相等对象HashCode是否相等" +
(o1.GetHashCode() == o2.GetHashCode()).ToString()); //验证同一对象返回相等的HashCode
int code = o1.GetHashCode();
o1._MyInt = ;
Console.WriteLine("同一对象HashCode是否相等:" +
(o1.GetHashCode() == code).ToString()); Console.Read();
}
}

输出:

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

转载请注明出处:

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

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

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

    /******************************************************* * * 作者:朱皖苏 * 创建日期:20180508 * 说明:此文件只包含一个类,具 ...

  2. [No0000B5]C# 类型基础 值类型和引用类型 及其 对象判等 深入研究1

    引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复 ...

  3. 定义类、System.Object对象、构造函数与析构函数、抽象类与静态类

    一.类定义 class MyClass { //类成员 } 1.访问级别 默认访问级别为internal(内部类),也可以是public(公共类) internal(内部类):当前项目中的代码才能访问 ...

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

    4.1 所有类型都从System.Object派生 “运行时”要求每个类型最终都从System.Object类型派生. 由于所有类型最终都从System.Object派生,所以每个类型的每个对象都保证 ...

  5. C# System.Object基类

    System.Object 基类 System.Object在.Net中是所有类型的基类,任何类型都直接或间接地继承自System.Object.没有指定基类的类型都默认继承于System.Objec ...

  6. System.Object 基类

    System.Object在.Net中是所有类型的基类,任何类型都直接或间接地继承自System.Object.没有指定基类的类型都默认继承于System.Object. 基类特性 正由于所有的类型都 ...

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

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

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

    目录 Java中Class类及用法 Class类原理 如何获得一个Class类对象 使用Class类的对象来生成目标类的实例 Object类 类构造器public Object(); register ...

  9. [CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系

    原文:[CLR via C#]4. 类型基础及类型.对象.栈和堆运行时的相互联系 CLR要求所有类型最终都要从System.Object派生.也就是所,下面的两个定义是完全相同的, //隐式派生自Sy ...

随机推荐

  1. springmvc 使用Jackson的配置

    <!--start:使用Jackson 1.x的配置,需要导入的jar包:jackson-core-lpgl-xxx.jar.jackson-mapper-lgpl-xxx.jar --> ...

  2. GNU Radio: Overview of the GNU Radio Scheduler

    Scetion 1: The Flowgraph The flowgraph moves data from sources into sinks. 一个流图由多个模块组成,其中一般包括信源(Sour ...

  3. 转--NLTK的内置函数

    NLTK的内置函数 1. 词语索引 (1) concordance函数    给出一个指定单词每一次出现,连同上下文一起显示. >>>text1.concordance('monst ...

  4. pgsql的同步须知

    pgsql的同步模式是根据master上的日志来做的同步,有两种同步方式,参考http://www.chinaxing.org/articles/Postgres/2012/12/14/2012-12 ...

  5. .NET后台访问其他站点代码整理

    HttpWebRequest request = WebRequest.Create(@"http://localhost:8080/mail/SendMail") as Http ...

  6. 腾讯互娱开源分布式开发框架Pebble

    构建游戏世界的Pebble 愿景:出色的游戏服务器端底层框架   现代游戏项目中,为了让更多的玩家能在一起玩,游戏服务器所需要承载的在线玩家数量越来越多.同时为了让游戏更好玩,越来越多复杂的业务逻辑都 ...

  7. bs的过滤器功能例子

    第一步 #src链接要符合下面要求,这里返回是 false or true def valid_img(src): return src.endswith('jpg') and 'img.jandan ...

  8. Bootstrap-CL:超大屏幕

    ylbtech-Bootstrap-CL:超大屏幕 1.返回顶部 1. Bootstrap 超大屏幕(Jumbotron) 本章将讲解 Bootstrap 支持的另一个特性,超大屏幕(Jumbotro ...

  9. Check failed: mdb_status == 0 (2 vs. 0) No such file or directory

    运行  ./examples/mnist/train_lenet.sh  时,碰到了这个问题. 一定是路径问题!!!仔细查看prototxt文件里面的各种路径!!! 解决方案: 把.prototxt里 ...

  10. instr 函数从后往前计数 instr(spell,' ',-1)

    update CY set last=substr(spell,instr(spell,' ',-1));