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