C#中的==、Equal、ReferenceEqual
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相关推荐
- String中的“equal方法”和“==”
二话不说,先来说下重写的事情: 在Java中,String .Math.还有Integer.Double....等这些封装类重写了Object中的equals()方法,让它不再比较其对象在内存中的地址 ...
- java中 == 与 equal 的区别
废话不多说了,开门见山吧,先来看一段代码: String str1 = new String("str"); String str2 = new String("str& ...
- java script中==和===_Java Script 中 ==(Equal) 和 === (Identity Equal) 的区别和比较算法逻辑...
判断两个变量是否相等在任何编程语言中都是非常重要的功能. JavaScript 提供了 == 和 === 两种判断两个变量是否相等的运算符,但我们开始学习的时候 JavaScript 的时候,就被一遍 ...
- java==和=_java中==和 equal区别
明确概念: 对象的引用:当用类创建一个对象时,类中的成员变量被分配内存空间,这些内存空间称为该对象的实体,而对象中存放着引用(地址),以确保该实体由该对象操作使用. 一.????比较对象为基本数据类型 ...
- equalwith java_java中==与equal()方法的区别
java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==), ...
- Java中关于==和equal的区别 以及equals()方法重写
例子i: string1="aaa"; string2="aaa"; String string3=new String("aaa"); S ...
- java中equals的反义词_equals是什么意思_equals怎么读_equals翻译_用法_发音_词组_同反义词_同样的人( equal的名词复数 )-新东方在线英语词典...
词汇搭配 用作形容词 (adj.)-+名词equal ability同等的能力 equal amount相同的数目 equal attention同样重视 equal chance平等的机会 equa ...
- java 获取对象方法有哪些方法有哪些方法有哪些_Java中创建String 对象的方法有哪些...
Java中创建String 对象的方法有哪些 发布时间:2020-11-25 16:45:30 来源:亿速云 阅读:71 作者:Leah 这篇文章将为大家详细讲解有关Java中创建String 对象的 ...
- C#中IEnumerableT.Distinct()将指定实体类对象用Lambda表达式实现多条件去重
背景说明 在EF等ORM框架中需要以List实体类的方式对数据进行大量操作,其中免不了对一些数据进行去重复,而C#中IEnumerable.Distinct()便提供了这一功能.只是对刚开始接触的新人 ...
- C++中的多重继承(二)
1,本文分析另一个多重继承问题及其工程中的解决方案,单继承加多接口实现的开发方式: 2,多重继承的问题三: 1,多重继承可能产生多个虚函数表: 1,实际工程中可能造成不可思议的问题,并且这些问题很难以 ...
最新文章
- pandas数据预处理(标准化归一化、离散化/分箱/分桶、分类数据处理、时间类型数据处理、样本类别分布不均衡数据处理、数据抽样)
- AngularJS 1.x 国际化——Angular-translate例子
- 编程笔试(解析及代码实现):求出一个整数中各位数上所包含全部质数之和
- android 子module混淆_Android 矢量图详解
- tomcat压力测试、优化
- Fibonacci Tree HDU - 4786——解题报告
- SQL Server - 高可用与灾难恢复(HADR)技术 -- AlwaysOn可用性组(理论篇)
- JS——构造函数、原型与实例之间的关系 及 原型链 的描述
- psp测试电池软件,电玩巴士首测成功-PSP神奇电池恢复砖头与降级
- Git 提交大文件提示 fatal: The remote end hung up unexpectedly
- 3分钟教会你解决SVN文件夹没有绿勾和红色感叹号的问题
- 华为相机M系列交叉编译32位openssl
- vip地址能ping不通_Nginx+keepalive局域网其它主机ping vip不通
- 射频中的 IM3、IIP3、OIP3、G、P1dB指标之间的关系
- 用c语言编写5颗骰子任意投掷总数为15 的概率,大工15春《应用统计》开卷考试期末复习题...
- Visual Studio Code编写html代码实现立方体相册,表白相册
- lsdyna如何设置set中的node_list_关于如何快速调教NGINX的几点总结
- 【unity】暂停,继续游戏,重新开始,退出
- 自动化测试平台化[v1.0.0][微服务化测试平台]
- PathAFL论文阅读+源码分析
热门文章
- 【持续更新】并查集题目集合
- java访问kudu,KUDU的java操作
- 二叉树查找结点及父结点_【剑指offer】57 二叉树的下一个结点
- linux下ftp二进制传输,FTP的两种传输模式:BINARY和ASCII
- java的mime类型_MIME类型大全
- 高德地图轨迹方向_阿里巴巴高德地图首席科学家任小枫:高精算法推动高精地图落地...
- 147.对链表进行插入排序
- 第三章CDMA的原理与应用(2)
- fastText原理和文本分类实战,看这一篇就够了
- 现代通信原理:期中考试答案