C#中Equals和==运算符的区别
				
									
					
					
						|  | 
							admin 2024年6月8日 18:18
								本文热度 2188 | 
					
				 
				前言
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 编辑过