Object中的公共方法解释:
公共方法:
Equals:
public class Object {
public virtual Boolean Equals(Object obj)
{
//如果两个引用指向同一个对象,他们肯定包含相同的值
if (this == obj) return true;
return false;
}
}
假设this和obj实例引用同一个对象,就返回true。似乎合理是因为Equals知道对象肯定包含和他自身一样的值。但假如实例引用不同对象,Equals就不肯定对象是否包含相同的值,所以就返回false。换言之,对于Object的Equals方法的默认实现,他是实现的实际是同一性,而非相等性。
Equals方法的正确实现:
1,如果obj实参为null,就返回false,因为调用非静态的Equals方法时,this所标识的当前对象显然不能为null
2,如果this和obj实参引用同一个对象,就返回true。在比较包含大量字段的对象时,这一步有助于提升性能
3,如果this和obj实参引用不同类型的对象,就返回false。一个string对象显然不等于一个FileStream对象
4,针对类型定义的每个字段,将this对象中的值与obj对象中的值进行比较,任何字段不相等,就返回false
5,调用基类的Equals方法来比较他的定义的任何字段,如果基类的Equals方法方法返回false,就返回false,否则就返回true
注:
同一性问题的测试使用Object的静态方法ReferenceEquals,其原型如下:
public static Boolean ReferenceEquals(Object objA, object objB)
{
return (objA==objB);
}
检查同一性问题(看两个引用是否指向同一个对象)务必调用ReferenceEquals,不应该使用C#的==操作符(除非先把两个操作数都转型为Object),因为某个操作数的类型可能重载了==符,为其赋值不同于同一性的语义。
System。ValueType(所有值类型 基类)都重写了Object的Equals方法,并进行了正确的实现来执行值的相等性检查(而不是同一性检查),ValueType的Equals内部实现如下:
1,如果obj实参为null,就返回false
2,如果this和obj实参引用不同类型的对象,就返回false
3,针对类型定义的每个实例字段,都将this对象中的值与obj对象中的值进行比较(而不是同一性检查)。ValueType的Equals内部的实现方式如下:
1,如果obj实参为null,就返回false
2,如果this和obj实参引用不同类型的对象,就返回false
3,针对类型定义的每个实例字段,都将this对象中的值与obj对象中的值进行比较(通过调用字段的equals方法),任何字段不相等,就返回false
4,返回true。ValueType的Equals方法不调用Object的Equals方法
在内部,ValueType的Equals方法利用反射完成上述步骤3,由于CLR反射机制慢,定义自己的值类型时应重写Equals方法来提供自己的实现,从而提高自己类型的实力进行相等性比较的性能,当然,自己的实现不调用base.Equals.
注:
定义自己的类型时,重写的Equals要符合相等性的4个特征
1,Equalse必须自反:x.Equals(x)肯定返回true
2,Equals必须对称:x.Equals(y)和y.Equals(x)返回值相同
3,Equals必须可传递:x.Equals(y)返回true,y.Equals(z)返回true,则x.Equals(z)肯定返回true
4,Equals必须一致。比较两个值不变,Equals返回值也不变
 
GetHashCode:
当你定义的类重写了Equals方法,还必须重写GetHashCode方法。之所以这样要求,是由于System.Collections.Hashtable类型,System.Collection.Generic.Dictionary类型以及其他一些集合的实现中,要求两个对象必须具有相同的哈希码才视为相等。所以重写Equals就必须重写GetHashCode确保相等性算法和对象哈希码算法一致性。简单点说就是,向集合中添加键/值对,首先要获取对象的哈希码。该哈希码指出键/值对要存储到那个哈希桶中。集合需要查找键时,会获取指定键对象的哈希码,该哈希码标识了现在要以顺序方式搜索的哈希桶,将在其中查找与指定键对象相等的键对象。采用这个算法来存储和查找键,意味着一旦修改了集合总的一个键对象,集合就再也找不到该对象。所以,需要修改哈希表中的键对象时,正确的做法是移除原来的键/值对,修改键对象,再将新的键/值对添加回哈希表。
自定义GetHashCode方法或许不是一件难事,但是取决已数据类型和数据的分布情况。下面会给出一个例子和规则:
internal sealed class Point
{
private readonly Int32 m_x, m_y;
public override int GetHashCode()
{
return m_x ^ m_y; //返回m_x和m_y的XOR结果
}
}
规则:
1,这个算法要提供良好的随机分布,使哈希表获得最佳性能
2,可在算法中调用积累的GetHashCode方法,并包含他的返回值。但一般不要调用Object或ValueType的GetHashCode方法,因为两者的实现都与高性能哈希算法不沾边
3,算法执行速度尽量快
4,包含相同值的不同对象应返回相同哈希值。例如,包含相同文本的两个string对象返回相同的哈希码
5, System.Object实现的GetHashCode方法对派生类型和其他的字段一无所知,所以返回一个在对象生存期保证不变的编号。
ToString:
默认返回类型的完整名称(this.GetType().FullName)
GetType:
返回从Type派生的一个类型的实例,指出调用GetType的那个对象时什么类型。返回的Type对象可以和反射类配合,获取与对象的类型有关的元数据信息。另外GetType是非虚方法,目的是防止类重写该fangfa,隐瞒企类型,进而破坏类型安全。
 
受保护方法:
MemberwiseClone:
这个非虚方法创建类的新实例,并阿静对象的实例字段设与this对象的实例字段完全一致。返回对新实例的引用。
Finalize:
在垃圾回收器判断对象作为垃圾被回收之后,在对象的内存被实际回收之前,会调用这个虚方法。需要在回收前执行清理工作的类型应重写该方法。

System.Object简介的更多相关文章

  1. NotSupportedException-无法将类型“System.DateTime”强制转换为类型“System.Object”

    几张图就可以说明一切 2015-03-29 21:54:09,206 [77] ERROR log - System.NotSupportedException: 无法将类型“System.DateT ...

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

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

  3. 类型与通用语言运行时:System.Object

    CLR 要求每个类型最终都要继承自 System.Object 类型 //隐式继承 Object class Employee { ... } //显示继承继承 Object class Employ ...

  4. C# 之 System.Object

    System.Object     C#中全部的类都直接或间接继承自System.Object类,这使得C#中的类得以单根继承.假设我们没有明白指定继承类,编译器缺省觉得该类继承自System.Obj ...

  5. 无法将类型“System.Nullable`1”强制转换为类型“System.Object”。LINQ to Entities 仅支持强制转换 EDM 基元或枚举类型。

    在一个项目中使用LINQ和EF时出现了题目所示的异常,搜索了很多资料都找不到解决办法,主要是因为EF方面的知识欠缺. 先将情况记录如下,以供以后参考. 查询主要设计两张表,由外键关联: 在进行下面的查 ...

  6. C# System.Object基类

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

  7. The type 'System.Object' is defined in an assembly that is not referenced

    记录一个错误,报 The type 'System.Object' is defined in an assembly that is not referenced,[System.Runtime] ...

  8. c# System.Object类和数据的安全转型

    .NET Fraework 最重要的引用类型之一是System命名空间中Object类.所有的类都是System.Object的派生类.System.Object类型的变量System.Object的 ...

  9. System.Object

    Object():System.Object类型的构造函数,自动调用. ~Object()/Finalize():System.Object类型的祈构函数,自动调用且不能够手动. Equals(obj ...

随机推荐

  1. jQuery === 面条式代码?

    自从React/Vue等框架流行之后,jQuery被打上了面条式代码的标签,甚至成了"过街老鼠",好像谁还在用jQuery,谁就还活在旧时代,很多人都争先恐后地拥抱新框架,各大博客 ...

  2. ★不容错过的PPT教程!

    IT工程师必须学会的计算机基础应用之一--PPT! 28项大神级PPT制作技术,学会后让你变成PPT高手哦!更多实用教程,请关注@IT工程师 !

  3. 5th-个人总结(Alpha阶段)

    一. 总结自己的Alpha过程 1.团队的整体情况 在团队中这次担任队长的职务. alpha阶段完成情况还算理想,大家都完成了指定的任务.但是也少不了犯错,一些需求没有划分的足够细致,后来功能完成后发 ...

  4. 团队作业4——第一次项目冲刺(Alpha版本)1st day

    一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 1.界面 主界面以及游戏界面大体上完成了 界面内的功能正在写 2.登陆方面 QQ授权还未申请 申请完在登陆界面完成后实现用QQ ...

  5. 201521123122 Java 第二周学习总结

    1. 本周学习总结 1.进一步了解了对码云的使用,学会了将本地代码上传到码云以及将码云上的代码克隆到eclipse上. 2.感觉本章学的基本语法和c的基本上差不多啊 3.string的对象创建后无法修 ...

  6. 201521123035《Java程序设计》第十二周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  7. 201521123110《Java程序设计》第14周学习总结

    1. 本周学习总结 2. 书面作业 1. MySQL数据库基本操作 2. 使用JDBC连接数据库与Statement 2.1 使用Statement操作数据库.(粘贴一段你认为比较有价值的代码,出现学 ...

  8. 201521123074 《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 Q1.finally 题目4-2 1.1 截图你的提交结果( ...

  9. JavaScript的5中基本数据类型

    javascript的5种基本数据类型有: Undefined,Null,Bollean,Number,String,1种复杂数据类型:Object. 1Boolean类型 将一个值转换为Bollea ...

  10. 源码安装H2O Http 服务端程序到Ubuntu服务器

    首先安装全家桶 apt install -y build-essential zlib1g-dev libpcre3 libpcre3-dev unzip cmake libncurses5-dev ...