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:
在垃圾回收器判断对象作为垃圾被回收之后,在对象的内存被实际回收之前,会调用这个虚方法。需要在回收前执行清理工作的类型应重写该方法。

转载于:https://www.cnblogs.com/yankun1991/p/6992271.html

System.Object简介相关推荐

  1. matlab为什么生成obj文件,为文件输入和输出创建新的 System object

    简介 System object 是派生自 matlab.System 的 MATLAB 类.因此,System object 都继承一个通用公共接口,其中包括标准方法: setup - 初始化对象, ...

  2. System.Object 基类

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

  3. Interface继承至System.Object?

    这其实是个很基础的问题,在我们学习C#类型的时候第一句就是所有的对象都继承至System.Object.今天一个同事问我Interface继承之System.Object.所以才有了本文. 在这里我只 ...

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

    4.1 所有类型都从System.Object派生 "运行时"要求每个类型最终都从System.Object类型派生. 由于所有类型最终都从System.Object派生,所以每个 ...

  5. System.Object 是 .NET 中所有类型的根吗?

    System.Object 是 .NET 中所有类型的根吗? Written by Allen Lee 这不是废话吗?每个人一接触 .NET 就会被提醒任何类型都是直接或者间接继承自 System.O ...

  6. matlab system object,通过 System object 实现模块

    使用 System object 实现您自己的算法. The System object source code controls the appearance of the block dialog ...

  7. 预定义的类型“System.Object”未定义或未导入

    打开一个以前的程序 ,发现报这个错误.检查了程序,发现程序的引用 System 不见了 ,尝试 引用失败.. 查了有人说重新建立 Sln文件有用.. 一头雾水,随后 尝试操作 ,程序有用了 具体步骤: ...

  8. C#中所有对象共同的基类是System.Object

    C#中所有对象共同的基类是System.Object 转载于:https://www.cnblogs.com/boke1/p/11057080.html

  9. .net类库学习(一)System.object

    System.Object 是基类,.NetFramework 中的所有其他类都从这个类派生而来.派生的.net类可以使用这个类的属性,而且那些类可以使用Object类的成员. 方法: Object. ...

最新文章

  1. GDCM:gdcm::ASN1的测试程序
  2. 域渗透基础之环境搭建(单域到组件域林)
  3. 【javascript】js处理字符串
  4. PHP中unset,array_splice删除数组中元素的区别
  5. linux查看网络连接命令,系统运维|使用netstat检测及监测网络连接
  6. Helm 3 完整教程(十四):Helm 函数讲解(8)数学计算函数
  7. llustrate dBpoweramp Asset UPnP Premium Mac 音频服务器
  8. 【C语言】之冒泡排序法(详解)
  9. GlassFish 理解
  10. 青岛大学2020计算机考研录取名单,青岛大学复试录取名单 青岛大学2020年复试名单...
  11. Vue本地项目实现其他局域网电脑在线访问
  12. mysql populate_BeanUtils.populate 的作用
  13. No matching provisioning profile found: Your build settings specify a provis...
  14. Docker Secret加密
  15. 为Fragment设置转场动画
  16. Linkage Mapper 专栏内容介绍
  17. 川希:普通人通过理财就能实现财务自由?大骗局!
  18. docker容器Linux环境下二维码图片中文字体乱码处理办法
  19. 算法笔记一 链表的翻转(C++)
  20. vim中使用cscope的方法

热门文章

  1. Valve开发校准软件,LCD屏也能与高端VR头显适配了
  2. Docker与OpenStack集成实战
  3. 互联网协议入门 : 用户 ------ 底层
  4. SQLServer------聚集索引和非聚集索引的区别
  5. view技术简单了解
  6. 关于Infobright的一个小TIPS
  7. Access数据库查询练习专用数据库 -手机号码归属地Access数据库_MobileDB(10万条记录)...
  8. DLL和COM的发展过程
  9. C++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
  10. java笔记javaweb部分