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是什么?如何使用System.Object?02-21
- MVC 5限制所有HTTP请求必须是POST方式02-21
- ItemsControl 的布局控件实例02-21
- 分享用.Net Core实现图片上传下载的实例教程02-21
- 最新开源DBLayer的详细介绍02-21
- C#中匿名委托以及Lambda表达式的实例详解02-21
- asp .net 面试题及答案分享02-21
- wcf什么意思?关于wcf的实例教程02-21
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- MVC 5限制所有HTTP请求必须是POST方式
MVC 5限制所有HTTP请求必须是POST方式
26-02-21 - 分享用.Net Core实现图片上传下载的实例教程
分享用.Net Core实现图片上传下载的实例教程
26-02-21 - asp .net 面试题及答案分享
asp .net 面试题及答案分享
26-02-21 - wcf什么意思?关于wcf的实例教程
wcf什么意思?关于wcf的实例教程
26-02-21 - C# 并行任务之Parallel类的实例介绍
C# 并行任务之Parallel类的实例介绍
26-02-21 - Win10预览版10041反馈功能的改进让分类更清晰
Win10预览版10041反馈功能的改进让分类更清晰
26-02-21 - win10企业版如何激活,怎么激活Win10企业版
win10企业版如何激活,怎么激活Win10企业版
26-02-21 - 最新Win10预览版10049中可关闭Flash Player
最新Win10预览版10049中可关闭Flash Player
26-02-21 - 什么是构造器?引用类型是什么?
什么是构造器?引用类型是什么?
26-02-21 - 怎么操作 ASP.NET Web API ?
怎么操作 ASP.NET Web API ?
26-02-21
