知识大全 C#中的类型相等与恒等(Equality & Identity)

Posted 类型

篇首语:时间铭记梦想的足迹,历史镌刻奋斗的功勋。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#中的类型相等与恒等(Equality & Identity)相关的知识,希望对你有一定的参考价值。

C#中的类型相等与恒等(Equality & Identity)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  CLR提供了可以区分类型的Equality 和Identity能力   Equality  如果两个对象是相同的类型 并且它们各自带有相同和等值的属性   Equality必须满足三个必要条件 reflexive symmetrics and transitive   reflexive: 自身相等 及a==a 是永远成立的   symmetrics: 对象性 及a==b成立那么b==a 也成立   transitive: 传递性 及a==b b==c成立那么a==c 也成立

  Identity  两个对象必须相等(意味着他们共享同一块内存区域)

  CLR提供了至少四种方法来判断两个对象的等价性   Public static bool ReferenceEquals(object left object right);

  Public static bool Equals(object left object right);

  Public virtual bool Equals(object right);   Public static bool operator==(MyClass left MyClass right); 

  ReferenceEquals方法总是用来判断两个对象的Identity的 不管是针对值类型还是引用类型 所以针对值类型 调用该方法总是会返回false 因为值类型作为这个方法的参数时会进行装箱操作

  静态的Equals方法提供了判断两个对象的Equality能力 在其实现的内部 调用了上述第三个虚拟的Equals方法 和ReferenceEquals一样 它们已经具备从底层判断两个对象的能力 我们从来不会覆写这两个方法

  实例Equals方法也是用来区分两个对象的Equality的

  对于引用类型的对象 它和ReferenceEquals方法几乎是一样的 (因为判断两个引用类型是否的Equality往往从Identity上就可以区分)

  而值类型的对象 我们不仅要判断他们具有相同的对象类型 还要判断他们的值相等 值类型从System ValueType继承而来 ValueType已经重写了Object Equals()方法 本来已经可以用来满足这些要求的 但是ValueType Equals()方法不是很有效 因为它必须要通过反射 在不知道具体的派生类型中 完成对它们所含有成员变量的值的比较 因此 建议在我们实现一个值类型的数据结构时 同时重写ValueType Equals()方法

  然而我们再回头看看引用类型 有时两个引用类型的对象往往被用来进行类似值类型的比较 比如 String类型 它虽然是引用类型 但它也重写了Equals方法 因为我们拿它来判断两个string是否相同(Equality) 实际是希望判断它们是否具有相同的内容 这是一个value semantics 因此 我们建议在考虑实现一个用作值语义环境下的引用类型时候 也重写基类的Object Equals()方法

  注 请参考MDSN或其它相关文档 如何实现Equals方法的重写

  上面的图示给了很好的例子来区分Equals和ReferenceEquals方法 被用来做Equility和Identity判断的区别

  ==运算符是可由类重载的运算符 它也是用来判断恒等的   对于未重载==的引用类型 会比较两个引用类型是否引用同一个对象 这跟引用类型的Equals()方法是一样的

  对于未重载==的值类型 该运算符会比较这两个值是否 按位 相等 即是否这两个值中的每个字段都相等 和Equals方法一样 推荐在自定义值类型中 也要重载==运算符 因为也存在反射在效率上的影响

cha138/Article/program/net/201311/15731

相关参考

知识大全 C#中的匿名类型与隐式类型变量

C#中的匿名类型与隐式类型变量  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在C#中引入了Li

知识大全 C#中的基元类型

C#中的基元类型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这篇文章我想复习下C#中的基元类

知识大全 C# .Net中的类型转换

C#.Net中的类型转换  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  装箱拆箱还是别名  许多

知识大全 数据库中与C#中的数据类型对照

数据库中与C#中的数据类型对照  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ///<su

知识大全 C# .Net中的类型之间的转换

C#.Net中的类型之间的转换  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!    装箱拆箱还是别

知识大全 .net的编程之路(一)

  一预定义数据类型  char字符类型单引号例如charx=this;  c#中的每个数据类型其实就是一个静态的类每个变量都是一个类的实例  例如将int型的数据转化为stringstringx=i

知识大全 详解C#中相等运算符重载可能造成的陷阱

详解C#中相等运算符重载可能造成的陷阱  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本文将对作

知识大全 判断题,无论发生什么经济业务,它都可以影响会计要素的增减变动,但不会影响会计等式的恒等关系。

判断题,无论发生什么经济业务,它都可以影响会计要素的增减变动,但不会影响会计等式的恒等关系。对的~~因为记帐必须遵循:有借必有贷、借贷必相等。所以,不论什么经济业务的发生,都不会影响会计要素的平衡关系

知识大全 c#中的数据库访问工厂

  上午看到一个兄弟的文章很辛苦的想实现不改代码只改配置来访问不同类型的数据库自己去实现工厂模式精神可嘉但是殊不知c#已经自己为不同类型数据库的访问做了一个工厂在这里我就把使用工厂的例子贴出来供不知道

知识大全 C#操作技巧的数据类型之间的转换

C#操作技巧的数据类型之间的转换  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  我们在VB中的数