C#中Equals和==运算符的区别
|
admin
2024年6月8日 18:18
本文热度 654
|
前言
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 输出结果
运算符==比较结果为:True
Equals方法比较结果为: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使用==比较结果为:False
student1与student2使用Equals方法比较结果为:False
student1与student3使用==比较结果为:True
student1与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使用==比较结果为:False
anonymous1与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 输出结果
运算符==比较结果为:True
Equals方法比较结果为:True
运算符==比较结果为:True
Equals方法比较结果为:True
#endregion
小结
1、值类型使用==运算符与Equals方法比较的是操作数的值。2、特殊的字符串引用类型(string)使用==运算符与Equals方法比较的是操作数的值。(因为它两是被重写过的)3、自定义引用类型使用==运算符与Equals方法比较的是操作数在栈中的地址。(我们可以重载Equals和==使其按我们自己的相等性逻辑进行比较)4、匿名类类型使用==运算符与Equals方法比较方式不同。
该文章在 2024/6/8 18:18:03 编辑过