.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(, "我是字符串");
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的更多相关文章
- ES 服务器 索引、类型仓库基类 BaseESStorage
/******************************************************* * * 作者:朱皖苏 * 创建日期:20180508 * 说明:此文件只包含一个类,具 ...
- [No0000B5]C# 类型基础 值类型和引用类型 及其 对象判等 深入研究1
引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复 ...
- 定义类、System.Object对象、构造函数与析构函数、抽象类与静态类
一.类定义 class MyClass { //类成员 } 1.访问级别 默认访问级别为internal(内部类),也可以是public(公共类) internal(内部类):当前项目中的代码才能访问 ...
- 第4章 类型基础 -- 4.1 所有类型都从System.Object派生
4.1 所有类型都从System.Object派生 “运行时”要求每个类型最终都从System.Object类型派生. 由于所有类型最终都从System.Object派生,所以每个类型的每个对象都保证 ...
- C# System.Object基类
System.Object 基类 System.Object在.Net中是所有类型的基类,任何类型都直接或间接地继承自System.Object.没有指定基类的类型都默认继承于System.Objec ...
- System.Object 基类
System.Object在.Net中是所有类型的基类,任何类型都直接或间接地继承自System.Object.没有指定基类的类型都默认继承于System.Object. 基类特性 正由于所有的类型都 ...
- Java基础12:深入理解Class类和Object类
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- 夯实Java基础系列9:深入理解Class类和Object类
目录 Java中Class类及用法 Class类原理 如何获得一个Class类对象 使用Class类的对象来生成目标类的实例 Object类 类构造器public Object(); register ...
- [CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系
原文:[CLR via C#]4. 类型基础及类型.对象.栈和堆运行时的相互联系 CLR要求所有类型最终都要从System.Object派生.也就是所,下面的两个定义是完全相同的, //隐式派生自Sy ...
随机推荐
- 基于ffmpegSDK的开发
#include <stdio.h> #include <libavutil/avutil.h> #include <libavcodec/avcodec.h> # ...
- panabit允许一台代理服务器只能收QQ企业邮箱,和内网ip通讯,限制除了QQ企业邮箱以外的所有内容规则
环境: 可访公网网的内网网段:192.168.0.0/24(员工网段) 192.168.2.0/24(服务器网段)两个内网网段. 不能访问公网的内网网段:192.168.4.0/24 4网段利用fo ...
- malloc/free与new/delete的不同及注意点
#include<iostream> using namespace std; class Obj{ public : Obj(){cout<<"Initializa ...
- 堆排序算法-python实现
#-*- coding: UTF-8 -*- import numpy as np def MakeHeap(a): for i in xrange(a.size / 2 - 1, -1, -1):# ...
- 一个单元测试 学习 aysnc await
using System; using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; name ...
- mysql-9索引
mysql索引的建立对于mysql的高效运行是很重要的,索引可以大大提高mysql的检索速度. 索引分为单列索引和组合索引. 单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索 ...
- OpenGL 画高斯随机函数
高斯函数代码 const float CFFTOceanShader::_getGaussianRandomFloat() const { float u1 = rand() / (float)RAN ...
- 软件测试——等价类划分(EditText * 3)
一.程序要求 EditBox 同时允许输入三个1到6个英文字符或数字,点击确定结束. 二.测试分析 编号 第一个输入框 第二个输入框 第三个输入框 输出 1 null null null 三个输入框均 ...
- Windows环境下为PHP5.6安装redis扩展和memcached扩展
一.php安装redis扩展 1.使用phpinfo()函数查看PHP的版本信息,这会决定扩展文件版本 2.根据PHP版本号,编译器版本号和CPU架构, 选择php_redis-2.2 ...
- Httpservlet源码说明
上一篇看了Servlet接口,现在来看下我们经常涉及的Httpservlet: /** * * Provides an abstract class to be subclassed to creat ...