【转载】C#扫盲之:==http://www.mamicode.com/Equals /ReferenceEquals

时间:2022-01-24 08:34:03

== Equals ReferenceEquals 三个相等性测试,是.NET供给给措施员使用的三个要领,他们之间有什么联系和区别,你真的仔细研究过?虽然之前也多几多少知道一点,但是有时候又不免混淆他们之间的观点和所适用的场合,决定做一个总结系统的描述这三个宝宝

2.值类型对照和引用类型对照

在编程中实际上我们只需要这两种对照,c#中类型也就这两种

  (1)值类型的对照:一般我们就是判断两个值类型实例的各自包罗的值是否相等

  (2)引用类型的对照:由于引用类型在内存中的漫衍有两部分,一个是引用类型的引用(存在于线程栈中),一个是引用类型的值(存在于托管堆);所以我们对照引用类型也就存在两种对照

默认情况下:值类型对照的是两个值是否相等(不装箱情况下),引用类型对照的是两个引用是否相等。

3.==, Equals,ReferenceEquals 的论述 3.1==

界说:静态相等标记,对应存在的!=,这个标记是一个可以重载的二元操纵符,可以用于对照两个东西是否相等。使用==对照东西时,C#在编译时就决定了所对照的类型,而且不会执行任何虚要领(Object.Equals)。这是大家所期望的相等行对照。

对付内置值类型,==判断的是两个东西的代数值是否相等。它会按照需要自动进行须要的类型转换,并按照两个东西的值是否相等返回true或者false

对付引用类型,则==一般情况下对照的这是引用类型的引用是否相等。

注意:但是某些内置的引用类型重载了==标记,例如string就重载==,使其对照的不是两个字符串的引用,而是对照的两个字符串字面量是否相等,如下图,所以对付引用类型最好不要使用==标记进行相等性对照,制止混淆。【对付引用类型操作==除了string是对照其值外,其余都是对照其引用,因为string是经常需要操纵,所以会直接对照其值,所以会对其特殊看待,所以如果遇见特殊的引用类型需要检察一下是否进行了==重载,默认情况大家都可以把==在对照引用类型时当成对照引用!

【转载】C#扫盲之:==http://www.mamicode.com/Equals /ReferenceEquals

  值类型的==对照:虽然i和j在栈上具有差此外内存空间,但是他们的代数值都为5;m和n类型被自动转换并对照代数值

int i = 5; int j = 5; Console.WriteLine(i == j);//值类型对照代数值 输出True int m = 6; double n = 6.0; Console.WriteLine(m == n);//类型自动转换并对照数值 输出True

  引用类型==对照:如下代码,两个object东西都在堆上申请了空间,在线程栈上存在两个差此外引用,所以输出功效为False

object obj1 = new object(); object obj2 = new object(); Console.WriteLine(obj2==obj1);//引用类型对照引用 输出False

 3.2 Equals

  界说:Equals属于Object的实例要领,用于对照两个东西的引用是否相等,注意:对付Object东西对照的是引用!

     然而对付值类型,类型不异(不会进行类型自动转换),并且数值不异(对付struct的每个成员都必需不异),则Equals返回 true,否则返回false。这是为什么呢?                 这是因为内置的值类型都重写了Object.Equals要领,所以值类型的Equals要领与引用类型的Equals就孕育产生了差此外效果。

Equals在措施运行时决定对照的类型--按照东西的实际类型进行对照,按照东西的类型挪用他们各自的Equals虚要领。

int i = 5; int j = 5; Console.WriteLine(i.Equals(j));//值类型对照 输出True int m = 6; double n = 6.0; Console.WriteLine(m.Equals(n));//类型不会自动转换并对照数值 输出False object obj1 = new object(); object obj2 = new object(); Console.WriteLine(obj2.Equals(obj1));//引用类型对照 输出False Console.WriteLine(obj2.Equals(string.Empty));//输出False,对照量东西的类型差别直接返回False

3.3 ReferenceEquals

  界说:Object的静态要领,对照两东西的引用是否相等,值类型和引用类型都是一样。

int i = 5; int j = 5; Console.WriteLine(object.ReferenceEquals(i, j));//输出False int m = 6; double n = 6.0; Console.WriteLine(object.ReferenceEquals(m, n));//输出False object obj1 = new object(); object obj2 = new object(); Console.WriteLine(object.ReferenceEquals(obj1, obj2));//输出False 4.三种对照要领的不异和区别

通过以上的探讨我们知道

ReferenceEquals对照东西的引用是否不异,而且是安适的对照
==和Equals异同