浅析C#中的等号“==”和Equals
作者:网络转载 发布时间:[ 2015/7/3 15:07:27 ] 推荐标签:软件开发 编程语言
1.“==”和Equals两个真的有关联吗?
对于“==”和Equals大多数网友都是这样总结的:
“==” 是比较两个变量的值相等。
Equals是比较两个变量是否指向同一个对象。
public class Person
{
public Person(string name)
{
this.Name = name;
}
public string Name { get; set; }
}
static void Main(string[] args)
{
string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
Console.WriteLine(a == b); //true
Console.WriteLine(a.Equals(b)); //true
object g = a;
object h = b;
Console.WriteLine(g == h); //false
Console.WriteLine(g.Equals(h)); //true
Person p1 = new Person("jia");
Person p2 = new Person("jia");
Console.WriteLine(p1 == p2); //false
Console.WriteLine(p1.Equals(p2)); //false
Person p3 = new Person("jia");
Person p4 = p3;
Console.WriteLine(p3 == p4); //true
Console.WriteLine(p3.Equals(p4)); //true
Console.ReadKey();
}
假如上述结论正确,“==” 是比较两个变量值相等,那么下面这句代码不应该为True.
Console.WriteLine(a == b); //true
很明显,上面的两个字符串变量:a,b 是指向两个不同的对象,即它们在栈空间存储的内存地址也是不同的。但为毛它们相等了呢?
2.什么是运算符重载?
运算符重载,是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。打个简单的比方:“+” 运算符,在“+” 两边全为数值类型的变量时,“+” 运算符表示数学上的“+” 意义。若“+” 运算符两边只要有一个为字符串类型,那么“+” 运算符表示连接字符串的意义。这样的运算符重载实例有很多,那么这跟本文主题有毛关系?我想说的是,上面字符串变量:a , b 是因为String类重载了运算符 “==”,看下列源代码:
public static bool operator == (String a, String b)
{
return String.Equals(a, b);
}
public static bool operator != (String a, String b)
{
return !String.Equals(a, b);
}
很明显String类中真的重载了“==”运算符,并且不止 “==” 还有 “!=” 哦。并且在重载运算符方法内部直接调用String类中的Equals方法,源代码如下:
public static bool Equals(String a, String b)
{
if ((Object)a==(Object)b)
{
return true;
}
if ((Object)a==null || (Object)b==null)
{
return false;
}
if (a.Length != b.Length)
return false;
return EqualsHelper(a, b);
}
由上可得:“==” 运算符并不一定是比较两个变量中存储的值是否相等,这要看当前运算符在当前这个类型中是否写有重载。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11