1. ReferenceEquals, == , Equals 
Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不是相等。

a) ReferenceEquals 
ReferenceEquals是Object的静态方法,用于比较两个引用类型的对象是否是对于同一个对象的引用。对于值类型它总是返回false。(因为Box以后的对象总是不同的,hehe)

b) ==是一个可以重载的二元操作符,可以用于比较两个对象是否相等。 
对于内置值类型,==判断的是两个对象的代数值是否相等。它会根据需要自动进行必要的类型转换,并根据两个对象的值是否相等返回true或者false。例如:

Int a = 100; 
Double b =100;

If(a == b) 
Console.WriteLine(“equal supports compare between different types!”);

上面这段程序将会输出: 
equal supports compare between different types!

而对于用户定义的值类型,如果没有重载==操作符,==将是不能够使用的。例如: 
Struct Userstruct1; 
Userstruct1 a; 
Userstruct1 b;

If(a == b) 
Console.WriteLine(“can == reach this far?”)

上面的这段代码是不能够通过编译的。可以通过重载使==作用于用户定义的值类型。

对于引用类型,== 默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时候才返回true。但是.NET Framework中的类很多对==进行了重载,例如String类的==与Equals的行为相同,判断两个字符串的内容是否相等。所以在应用中,对于 系统定义的引用类型建议不要使用==操作符,以免程序出现与预期不同的运行结果。

c) Equals 作为Object内置方法,Equals支持对于任意两个CTS对象的比较。 
Equals它有静态方法和可重载的一个版本,下面的程序片断解释了这两个方法的用法,

int a = 5; 
int b = 5;

If(Object.Equals(a ,b)) 
// you can also use if(a.Equals(b)) 

Console.WriteLine(“a is equal to b”); 
}

事实上,这两个版本的结果完全相同,如果用户重载了Equals,调用的都是用户重载后的Equals。Equals的静态方法的好处是可以不必考虑用于比较的对象是否为null。

Equals方法对于值类型和引用类型的定义不同,对于值类型,类型相同,并且数值相同(对于struct的每个成员都必须相同),则Equals返回 true,否则返回false。而对于引用类型,默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时 候才返回true。可以根据需要对Equals进行重载,例如String类的Equals用于判断两个字符串的内容是否相等。

StringBuilder a = new StringBuilder(); 
a.Append("the test a"); 
String s1 = a.ToString(); 
String s2 = "the test a";

if (s2 == s1) 
Console.WriteLine("== returns true");

if (Object.Equals(s2, s1)) 

Console.WriteLine("equals returns true"); 
}

if (Object.ReferenceEquals(s2, s1)) 

Console.WriteLine("ReferenceEquals returns true"); 
}

这个实例将输出: 
== returns true 
equals returns true

注:对于String类,直接声明s1 = “the test a”的话,输出结果将包含 "ReferenceEquals returns true", 
因为默认的,String对于声明的相同的字符串在堆上只保留一个Copy,所以s1与s2将会指向相同的Reference

在C#中,有多种比较方法,有referenceequal,equals,equalsto,但他们之间是有细微差别的。

referenceequal的实例

class MyClass {

static void Main() { 
      object o = null; 
      object p = null; 
      object q = new Object();

Console.WriteLine(Object.ReferenceEquals(o, p)); 
      p = q; 
      Console.WriteLine(Object.ReferenceEquals(p, q)); 
      Console.WriteLine(Object.ReferenceEquals(o, p)); 
   } 
如果要是对象都指向空引用,那么它返回true,另外,p=q;这个赋值语句,对于值类型来说,只是把地址复制给了p,并没有深拷贝。所以当比较引用时,返回true。如果比较o.equals(p),那么编译器会报错,因为equals方法不能比较null的情况。正因为如此,referenceequals方法才不受开发人员欢迎。另外,equals为实例的虚方法,referenceequals为静态方法。基元类型的==,就是操作符重载,使用的 equals方法判等。当然,还有一个equals的静态方法,静态equals与实例equals方法的唯一区别是:实例equals在对2个进行比较时,如果有一个为null,或者都是null,就会抛出异常,但静态equals方法不会,静态equals方法首先对2者检查是否为null,如果有为null的情况,就返回false,如果没有null,那么就调用实例equals方法来进行比较。

memberwiseclone()翻译为成员智能复制,呵呵,为啥智能,我就讲讲。智能就在它区别对待值类型和引用类型。

MemberwiseClone 方法创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。

例如,考虑一个名为 X 的对象,该对象引用对象 A 和 B。对象 B 又引用对象 C。X 的浅表副本创建一个新对象 X2,该对象也引用对象 A 和 B。与此相对照,X 的深层副本创建一个新对象 X2,该对象引用新对象 A2 和 B2,它们分别是 A 和 B 的副本。B2 又引用新对象 C2,C2 是 C 的副本。

关于深拷贝和浅拷贝,深拷贝就是创建一个一摸一样的对象,浅拷贝的话仍然是同一个对象,但是却有2个计数器,2个强引用指向它。

转载于:https://www.cnblogs.com/zagelover/articles/2741409.html

C#中的==、Equal、ReferenceEqual相关推荐

  1. String中的“equal方法”和“==”

    二话不说,先来说下重写的事情: 在Java中,String .Math.还有Integer.Double....等这些封装类重写了Object中的equals()方法,让它不再比较其对象在内存中的地址 ...

  2. java中 == 与 equal 的区别

    废话不多说了,开门见山吧,先来看一段代码: String str1 = new String("str"); String str2 = new String("str& ...

  3. java script中==和===_Java Script 中 ==(Equal) 和 === (Identity Equal) 的区别和比较算法逻辑...

    判断两个变量是否相等在任何编程语言中都是非常重要的功能. JavaScript 提供了 == 和 === 两种判断两个变量是否相等的运算符,但我们开始学习的时候 JavaScript 的时候,就被一遍 ...

  4. java==和=_java中==和 equal区别

    明确概念: 对象的引用:当用类创建一个对象时,类中的成员变量被分配内存空间,这些内存空间称为该对象的实体,而对象中存放着引用(地址),以确保该实体由该对象操作使用. 一.????比较对象为基本数据类型 ...

  5. equalwith java_java中==与equal()方法的区别

    java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==), ...

  6. Java中关于==和equal的区别 以及equals()方法重写

    例子i: string1="aaa"; string2="aaa"; String string3=new String("aaa"); S ...

  7. java中equals的反义词_equals是什么意思_equals怎么读_equals翻译_用法_发音_词组_同反义词_同样的人( equal的名词复数 )-新东方在线英语词典...

    词汇搭配 用作形容词 (adj.)-+名词equal ability同等的能力 equal amount相同的数目 equal attention同样重视 equal chance平等的机会 equa ...

  8. java 获取对象方法有哪些方法有哪些方法有哪些_Java中创建String 对象的方法有哪些...

    Java中创建String 对象的方法有哪些 发布时间:2020-11-25 16:45:30 来源:亿速云 阅读:71 作者:Leah 这篇文章将为大家详细讲解有关Java中创建String 对象的 ...

  9. C#中IEnumerableT.Distinct()将指定实体类对象用Lambda表达式实现多条件去重

    背景说明 在EF等ORM框架中需要以List实体类的方式对数据进行大量操作,其中免不了对一些数据进行去重复,而C#中IEnumerable.Distinct()便提供了这一功能.只是对刚开始接触的新人 ...

  10. C++中的多重继承(二)

    1,本文分析另一个多重继承问题及其工程中的解决方案,单继承加多接口实现的开发方式: 2,多重继承的问题三: 1,多重继承可能产生多个虚函数表: 1,实际工程中可能造成不可思议的问题,并且这些问题很难以 ...

最新文章

  1. pandas数据预处理(标准化归一化、离散化/分箱/分桶、分类数据处理、时间类型数据处理、样本类别分布不均衡数据处理、数据抽样)
  2. AngularJS 1.x 国际化——Angular-translate例子
  3. 编程笔试(解析及代码实现):求出一个整数中各位数上所包含全部质数之和
  4. android 子module混淆_Android 矢量图详解
  5. tomcat压力测试、优化
  6. Fibonacci Tree HDU - 4786——解题报告
  7. SQL Server - 高可用与灾难恢复(HADR)技术 -- AlwaysOn可用性组(理论篇)
  8. JS——构造函数、原型与实例之间的关系 及 原型链 的描述
  9. psp测试电池软件,电玩巴士首测成功-PSP神奇电池恢复砖头与降级
  10. Git 提交大文件提示 fatal: The remote end hung up unexpectedly
  11. 3分钟教会你解决SVN文件夹没有绿勾和红色感叹号的问题
  12. 华为相机M系列交叉编译32位openssl
  13. vip地址能ping不通_Nginx+keepalive局域网其它主机ping vip不通
  14. 射频中的 IM3、IIP3、OIP3、G、P1dB指标之间的关系
  15. 用c语言编写5颗骰子任意投掷总数为15 的概率,大工15春《应用统计》开卷考试期末复习题...
  16. Visual Studio Code编写html代码实现立方体相册,表白相册
  17. lsdyna如何设置set中的node_list_关于如何快速调教NGINX的几点总结
  18. 【unity】暂停,继续游戏,重新开始,退出
  19. 自动化测试平台化[v1.0.0][微服务化测试平台]
  20. PathAFL论文阅读+源码分析

热门文章

  1. 【持续更新】并查集题目集合
  2. java访问kudu,KUDU的java操作
  3. 二叉树查找结点及父结点_【剑指offer】57 二叉树的下一个结点
  4. linux下ftp二进制传输,FTP的两种传输模式:BINARY和ASCII
  5. java的mime类型_MIME类型大全
  6. 高德地图轨迹方向_阿里巴巴高德地图首席科学家任小枫:高精算法推动高精地图落地...
  7. 147.对链表进行插入排序
  8. 第三章CDMA的原理与应用(2)
  9. fastText原理和文本分类实战,看这一篇就够了
  10. 现代通信原理:期中考试答案