关于Equals和==的应用

关于Equals和==的应用:
这两个都是用于判断等于的

区别:
前一个是方法,Object的,有两个实现;后一个是运算符

无论哪一种都可以重载。当然你要写出重载的实现。这一点有原则的,建议参看MSDN的《Equals 和相等运算符 (==) 的实现指南》,ms-help://MS.MSDNQTR.2003FEB.2052/cpgenref/html/cpconimplementingequalsoperator.htm

[来源于MSDN资料----Begin]
类型的类别
通用类型系统支持两种一般类别的类型,每一类都细分成子类别:

值类型
值类型直接包含它们的数据,值类型的实例要么在堆栈上,要么内联在结构中。值类型可以是内联的(由运行库实现)、用户定义的或枚举的。有关内联值类型的列表,请参见 .NET Framework 类库。


引用类型
引用类型存储对值的内存地址的引用,位于堆上。引用类型可以是自描述类型、指针类型或接口类型。引

用类型的类型可以由自描述类型的值来确定。自描述类型进一步细分成数组和类类型。类类型是用户定义

的类、装箱的值类型和委托。
[来源于MSDN资料----End]


类型有两类:

值类型主要由两类组成:Struct(结构)类型 ,枚举类型 。
结构类型包括用户定义的 struct 类型以及下列内置的简单类型:{Numeric(数值)类型 [整型 ,浮点型 ,decimal ],bool }

引用类型包括:string ,object ,class以及数组,当然也有指针(在C#里面属于不安全类型,在这里仅仅提及,不讨论)


这里要说的是这些类型的等于比较有一定区别:
值类型和string无论用Equals和==都是比较内容,内容相等返回true,反之false;
除了string外的引用类型使用Equals和==都是比较地址,地址相等返回true,反之false;


需要注意一点:
关于Object.Equals。最好参看MSDN的这个部分。


这里写个int 和 object(装箱int这类值类型),看下Equals和==的结果。以下代码着重观察object.Equals对值类型装箱后的比较。在此仅仅写个小代码演示:

int i = 0;
int j = 0;

Console.WriteLine(i == j);//true;
Console.WriteLine(i.Equals(j));//true;

object x = i;
object y = j;
Console.WriteLine(x == y);//false;
Console.WriteLine(x.Equals(y));//true;

如果object x,y指向的是一个非string的引用类型对象,那么以上两个结果都是false


关于这个只能写到这里了。

原文地址:https://www.cnblogs.com/GoGoagg/p/1250309.html