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个强引用指向它。

出自 51CTO.COM博客

转载于:https://www.cnblogs.com/leosky2008/archive/2007/07/12/814818.html

转载:ReferenceEquals, == , Equals 区别相关推荐

  1. Equals,ReferenceEquals,==的区别

    Equals,ReferenceEquals,==的区别 在.net中有几种比较相等的方法 object的静态ReferenceEquals() object的静态Equals() object的示例 ...

  2. C#和Java中“==”和“equals”区别

    C#中"=="和"equals"区别如下: 1 using System; 2 class Program 3 { 4 public static void M ...

  3. equalsignorecase和equals区别

    今天写代码,突然忘了equalsignorecase和equals区别,赶紧记录一下. 先下结论: 区别:equals()是Object类中定义的方法,判断两个对象是不是"相等", ...

  4. == Equals ReferenceEquals 的区别

    .net 中有几种比较相等的方法 object 的静态ReferenceEquals() object 的静态Equals() object 的实例Equals() 运算符== Object 中的cl ...

  5. C# == 和equals()区别

    如以下代码: ? 1 2 3 4 5 int age = 25; short newAge = 25; Console.WriteLine(age == newAge);  //true Consol ...

  6. 转载------------java equals 方法

    作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 ...

  7. java之==和equals区别

    2019独角兽企业重金招聘Python工程师标准>>> "=="操作符的作用 1.用于基本数据类型的比较 2.判断引用是否指向堆内存的同一块地址. equals所 ...

  8. '=='和equals区别以及jvm内存分配

    "=="和equals方法究竟有什么区别? 比较之前先了解一些背景 (1)Java中内存分配模型 java的内存模型主要分三种, 栈:每个栈中的数据(原始类型和对象引用)都是私有的 ...

  9. Java中的==和equals区别

    概述:       A.==可用于基本类型和引用类型:当用于基本类型时候,是比较值是否相同:当用于引用类型的时候,是比较对象是否相同.       B.对于String a = "a&quo ...

  10. java和equals区别_JAVA中==与equals的区别

    equals如果没有被重写的话,和==的作用是一样的,都是判断两个对象引用是否指向同一个地址.一般重写了equals()方法就表示比较它们"实际意义上相等",比较的是内容,而不是引 ...

最新文章

  1. windows server 2008 r2 enterprise ,惠普DL 580 G7服务器报,事件 ID: 47错误。
  2. Nginx +Tomcat 实现动静态分离(转)
  3. 女生做产品经理好吗_女生天生就是产品经理,不服来战!
  4. Confluence 6 管理协同编辑 - 最大编辑者的限制
  5. 提升写作效率,让 Word 更好地为你所用
  6. 【学习笔记】概率论与数理统计 - 陈希孺--第一章.事件的概率
  7. 查找FB15k-237 entity id对应实体数据
  8. oracle11g_R2 exp imp 用法
  9. 微信小程序之自定义表单组件(radio)
  10. 娄底职业技术学院计算机老师,2019年娄底职业技术学院公开招聘教师员工拟聘人员公示...
  11. W3school导航条实现的两种方法
  12. Python:利用多种方式解微分方程(以二阶微分系统零状态响应为例)
  13. ECNU || 宇恒棋
  14. 【区块链 | Polygon】Polygon区块链PHP开发包-使用PHP语言开发Polygon
  15. IBM MQ Linux安装与卸载
  16. A Convolutional Neural Network Model for Predicting a Product’s Function, Given Its Form
  17. GGS-DDU 【HDU - 4966】【最小树形图】
  18. Linux根文件系统(rootfs原理详解)
  19. linux蓝牙麦克风,Linux下蓝牙立体声配置(A2DP profile)
  20. demo1—java读取Excel文件到数据库、java制作准考证

热门文章

  1. php趣味编程 - php 余弦曲线
  2. php $_SERVER详细参数解析
  3. 考前必背的50个知识点——系统集成项目管理工程师考试
  4. linux web目录写入权限命令,Linux下Web目录和文件安全权限设置
  5. Unity的序列化机制探索
  6. 对象用[]来获取属性的注意点
  7. String转为byte[] ,byte[]转为String,byte[]与String的相互转换
  8. c语言几个字符串排序,请教多个字符串排序(不用数组)
  9. 【渝粤教育】国家开放大学2018年春季 0551-22T素描(二) 参考试题
  10. 【渝粤教育】国家开放大学2018年春季 0550-22T素描(一) 参考试题