alsHelper(a, b));//返回true
}
{
char[] ch = new char[] { 'a', 'A', '@' };
string a = "aA@";
string b = new string(ch);
Console.WriteLine(EqualsHelper(a, b));//返回true
}
4.1.8、结论:string类型 a == b、string.Equals(a, b)、a.Equals(b)、a.Equals((object)b),如果 a 的值与 b 的值相同,则为 true;否则为 false。
4.2、类class
4.2.1、C#语言规范5.0中文版中的引用类型相等运算符介绍
4.2.2、Object内部的Equals函数
Object
{
public virtual bool Equals(Object obj)
{
return RuntimeHelpers.Equals(this, obj);//无法查到详细代码
}
public static bool Equals(Object objA, Object objB)
{
if (objA==objB) {
return true;
}
if (objA==null || objB==null) {
return false;
}
return objA.Equals(objB);
}
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
[System.Runtime.Versioning.NonVersionable]
public static bool ReferenceEquals (Object objA, Object objB) {
return objA == objB;
}
}
4.2.3、类(不重写Equal函数 and 运算符'==')
public class RefPoint
{
public double x;
public double y;
public double z;
public RefPoint(double X, double Y, double Z)
{
this.x = X;
this.y = Y;
this.z = Z;
}
}
RefPoint p1 = new RefPoint(4, 5, 6);
RefPoint p2 = p1;
Console.WriteLine(p1.Equals(p2));//返回true
Console.WriteLine(object.Equals(p1, p2));//返回true
Console.WriteLine(object.ReferenceEquals(p1, p2));//返回true
Console.WriteLine(p1 == p2);//返回true
p2 = new RefPoint(4, 5, 6);//虽然值一样,但是引用对象不一样
Console.WriteLine(p1.Equals(p2));//返回false
Console.WriteLine(object.Equals(p1, p2));//返回false
Console.WriteLine(object.ReferenceEquals(p1, p2));//返回false
Console.WriteLine(p1 == p2);//返回false
4.2.4、类(重写Equal函数 and 运算符'==')
public class RefPoint
{
public double x;
public double y;
public double z;
public RefPoint(double X, double Y, double Z)
{
this.x = X;
this.y = Y;
this.z = Z;
}
public override bool Equals(Object obj)
{
if (!(obj is RefPoint))
{
return false;
}
if (((RefPoint)obj).x == this.x)
{
return true;
}
return false;
}
public bool Equals(RefPoint obj)
{
if (obj.x == this.x)
{
return true;
}
return false;
}
public static bool operator ==(RefPoint left, RefPoint right)
{
return left.x == right.x;
}
public static bool operator !=(RefPoint left, RefPoint right)
{
return left.x != right.x;
}
}
RefPoint p1 = new RefPoint(4, 5, 6);
RefPoint p2 = p1;
Console.WriteLine(p1.Equals(p2));//返回true
Console.WriteLine(object.Equals(p1, p2));//返回true
Console.WriteLine(object.ReferenceEquals(p1, p2));//返回true
Console.WriteLine(p1 == p2);//返回true
p2 = new RefPoint(4, 50, 60);
Console.WriteLine(p1.Equals(p2));//返回true
Console.WriteLine(object.Equals(p1, p2));//返回true
Console.WriteLine(object.ReferenceEquals(p1, p2));//返回false
Console.WriteLine(p1 == p2);//返回true
4.2.5、ReferenceEquals (Object objA, Object objB)返回objA == objB。如果objA、 objB引用同一个对象(只判断是否引用同一个对象,即使我们自行重载了'=='运算符,也没用),返回true;否则,返回false。
5、总结
先介绍简单值类型,再到结构体,字符串,类。把每个类型Equal和'=='用法做个总结,加深自己记忆的同时,也希望能帮助到你。另:本文只代表本人观点,如果有误,还望告知。
6、参考
6.2、 C#语言规范5.0中文版