C#中Equals和==运算符的区别
|
admin
2024年6月8日 18:18
本文热度 2164
|
前言
C#语言是一种强类型语言,要求每个变量都必须指定数据类型。C#语言的数据类型分为值类型和引用类型二种。在实际编写程序时,经常会对二个数据进行比较其是否相等。C#语言为我们提供了==运算符与Equals方法。在应用这二种方式时是存在一些区别的,下面就一起了解两者有什么区别。
值类型相等
对于预定义的值类型,二个操作数的相等比较,是判断操作数的值是否相等。如果相等则返回true,不等则返回false。在值类型的判断上,不论是使用运算符==,还是使用Equals方法二者是没有区别的。namespace Fountain.EquationDemo{ class Program { /// <summary> /// 控制台程序入口 /// </summary> static void Main(string[] args) { double applePrice = 9.45; double bananaPrice = 9.45; // 使用==比较 Console.WriteLine("运算符==比较结果为:{0}", applePrice == bananaPrice); // 使用 Equals 方法比较 Console.WriteLine("Equals方法比较结果为:{0}", applePrice.Equals(bananaPrice)); Console.ReadLine(); } }}#region 输出结果运算符==比较结果为:TrueEquals方法比较结果为:True#endregion
引用型相等
string是一种特殊的引用类型,所以对于引用类型的相等判断,我们需分为自定义的引用类型和特殊的字符串引用类型二个方向看。
1、自定义的引用类型
自定义引用类型使用Equals和==运算符二种方式比较的是引用类型在栈中的地址。当然一些预定义的引用类型也是一样的。(没有对Equals和==进行过重载)namespace Fountain.EquationDemo{ class Program { /// <summary> /// 控制台程序入口 /// </summary> static void Main(string[] args) { Student student1 = new Student() { ID = "0001", Name = "小明" }; Student student2 = new Student() { ID = "0001", Name = "小明" }; // 定义对象 并将 student1 赋值给对象 student3 Student student3 = student1; // 二个对象比较 Console.WriteLine("student1与student2使用==比较结果为:{0}", student1 == student2); // 二个对象比较 Console.WriteLine("student1与student2使用Equals方法比较结果为:{0}", student1.Equals(student2)); // 二个对象比较 Console.WriteLine("student1与student3使用==比较结果为:{0}", student1 == student3); // 二个对象比较 Console.WriteLine("student1与student3使用Equals方法比较结果为:{0}", student1.Equals(student3)); } } /// <summary> /// 定义自定义类 /// </summary> public class Student { /// <summary> /// 学号 /// </summary> public string ID { get; set; } /// <summary> /// 姓名 /// </summary> public string Name { get; set; } }}#region 输出结果student1与student2使用==比较结果为:Falsestudent1与student2使用Equals方法比较结果为:False
student1与student3使用==比较结果为:Truestudent1与student3使用Equals方法比较结果为:True#endregion
匿名类使用==运算符是比较操作数在栈中的地址,使用Equals方法则比较操作数的值。namespace Fountain.EquationDemo{ class Program { /// <summary> /// 控制台程序入口 /// </summary> static void Main(string[] args) { // 声明匿名类 var anonymous1 = new { ID = "1000", Name = "孙悟空" }; // 匿名类 var anonymous2 = new { ID = "1000", Name = "孙悟空" }; // Console.WriteLine("anonymous1与anonymous2使用==比较结果为:{0}", anonymous1 == anonymous2); // Console.WriteLine("anonymous1与anonymous2使用Equals方法比较结果为:{0}", anonymous1.Equals(anonymous2)); } }}#region 输出结果anonymous1与anonymous2使用==比较结果为:Falseanonymous1与anonymous2使用Equals方法比较结果为:True#endregion
2、 特殊的字符串引用类型
.NET在string类型上重写了Equals方法和==运算符,使Equals和==运算符二种方式比较是以string字符串内容进行。也就是说这二者在string类型上是没有区别的。namespace Fountain.EquationDemo{ class Program { /// <summary> /// 控制台程序入口 /// </summary> static void Main(string[] args) { string expressCode = "YTO"; string objectExpressCode = new string(new char[] { 'Y', 'T', 'O'});
Console.WriteLine("运算符==比较结果为:{0}", "YTO" == objectExpressCode); Console.WriteLine("Equals方法比较结果为:{0}", "YTO".Equals(objectExpressCode));
Console.WriteLine("运算符==比较结果为:{0}", "YTO" == expressCode); Console.WriteLine("Equals方法比较结果为:{0}", "YTO".Equals(expressCode)); } }}
#region 输出结果运算符==比较结果为:TrueEquals方法比较结果为:True
运算符==比较结果为:TrueEquals方法比较结果为:True#endregion
小结
1、值类型使用==运算符与Equals方法比较的是操作数的值。2、特殊的字符串引用类型(string)使用==运算符与Equals方法比较的是操作数的值。(因为它两是被重写过的)3、自定义引用类型使用==运算符与Equals方法比较的是操作数在栈中的地址。(我们可以重载Equals和==使其按我们自己的相等性逻辑进行比较)4、匿名类类型使用==运算符与Equals方法比较方式不同。
该文章在 2024/6/8 18:18:03 编辑过