前言
C#語言是一種強類型語言,要求每個變量都必須指定數(shù)據(jù)類型。C#語言的數(shù)據(jù)類型分為值類型和引用類型二種。在實際編寫程序時,經(jīng)常會對二個數(shù)據(jù)進行比較其是否相等。C#語言為我們提供了==運算符與Equals方法。在應(yīng)用這二種方式時是存在一些區(qū)別的,下面就一起了解兩者有什么區(qū)別。
值類型相等
對于預(yù)定義的值類型,二個操作數(shù)的相等比較,是判斷操作數(shù)的值是否相等。如果相等則返回true,不等則返回false。在值類型的判斷上,不論是使用運算符==,還是使用Equals方法二者是沒有區(qū)別的。namespace Fountain.EquationDemo
{
class Program
{
/// <summary>
/// 控制臺程序入口
/// </summary>
static void Main(string[] args)
{
double applePrice = 9.45;
double bananaPrice = 9.45;
// 使用==比較
Console.WriteLine("運算符==比較結(jié)果為:{0}", applePrice == bananaPrice);
// 使用 Equals 方法比較
Console.WriteLine("Equals方法比較結(jié)果為:{0}", applePrice.Equals(bananaPrice));
Console.ReadLine();
}
}
}
#region 輸出結(jié)果
運算符==比較結(jié)果為:True
Equals方法比較結(jié)果為:True
#endregion
引用型相等
string是一種特殊的引用類型,所以對于引用類型的相等判斷,我們需分為自定義的引用類型和特殊的字符串引用類型二個方向看。
1、自定義的引用類型
自定義引用類型使用Equals和==運算符二種方式比較的是引用類型在棧中的地址。當(dāng)然一些預(yù)定義的引用類型也是一樣的。(沒有對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使用==比較結(jié)果為:{0}", student1 == student2);
// 二個對象比較
Console.WriteLine("student1與student2使用Equals方法比較結(jié)果為:{0}", student1.Equals(student2));
// 二個對象比較
Console.WriteLine("student1與student3使用==比較結(jié)果為:{0}", student1 == student3);
// 二個對象比較
Console.WriteLine("student1與student3使用Equals方法比較結(jié)果為:{0}", student1.Equals(student3));
}
}
/// <summary>
/// 定義自定義類
/// </summary>
public class Student
{
/// <summary>
/// 學(xué)號
/// </summary>
public string ID { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string Name { get; set; }
}
}
#region 輸出結(jié)果
student1與student2使用==比較結(jié)果為:False
student1與student2使用Equals方法比較結(jié)果為:False
student1與student3使用==比較結(jié)果為:True
student1與student3使用Equals方法比較結(jié)果為:True
#endregion
匿名類使用==運算符是比較操作數(shù)在棧中的地址,使用Equals方法則比較操作數(shù)的值。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使用==比較結(jié)果為:{0}", anonymous1 == anonymous2);
//
Console.WriteLine("anonymous1與anonymous2使用Equals方法比較結(jié)果為:{0}", anonymous1.Equals(anonymous2));
}
}
}
#region 輸出結(jié)果
anonymous1與anonymous2使用==比較結(jié)果為:False
anonymous1與anonymous2使用Equals方法比較結(jié)果為:True
#endregion
2、 特殊的字符串引用類型
.NET在string類型上重寫了Equals方法和==運算符,使Equals和==運算符二種方式比較是以string字符串內(nèi)容進行。也就是說這二者在string類型上是沒有區(qū)別的。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("運算符==比較結(jié)果為:{0}", "YTO" == objectExpressCode);
Console.WriteLine("Equals方法比較結(jié)果為:{0}", "YTO".Equals(objectExpressCode));
Console.WriteLine("運算符==比較結(jié)果為:{0}", "YTO" == expressCode);
Console.WriteLine("Equals方法比較結(jié)果為:{0}", "YTO".Equals(expressCode));
}
}
}
#region 輸出結(jié)果
運算符==比較結(jié)果為:True
Equals方法比較結(jié)果為:True
運算符==比較結(jié)果為:True
Equals方法比較結(jié)果為:True
#endregion
小結(jié)
1、值類型使用==運算符與Equals方法比較的是操作數(shù)的值。2、特殊的字符串引用類型(string)使用==運算符與Equals方法比較的是操作數(shù)的值。(因為它兩是被重寫過的)3、自定義引用類型使用==運算符與Equals方法比較的是操作數(shù)在棧中的地址。(我們可以重載Equals和==使其按我們自己的相等性邏輯進行比較)4、匿名類類型使用==運算符與Equals方法比較方式不同。
該文章在 2024/6/8 18:18:03 編輯過