C#基礎(chǔ):Equals()與運(yùn)算符==的區(qū)別分析
==操作比較的是兩個(gè)變量的值是否相等。
equals()方法比較的是兩個(gè)對(duì)象的內(nèi)容是否一致.equals也就是比較引用類型是否是對(duì)同一個(gè)對(duì)象的引用。
對(duì)于值類型的比較,這里就不做描述了,下面討論引用類型的比較:
首先我們看一段程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Person
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public Person(string name)
{
this.name = name;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
Console.WriteLine(a == b);
Console.WriteLine(a.Equals(b));
object g = a;
object h = b;
Console.WriteLine(g == h);
Console.WriteLine(g.Equals(h));
Person p1 = new Person("jia");
Person p2 = new Person("jia");
Console.WriteLine(p1 == p2);
Console.WriteLine(p1.Equals(p2));
Person p3 = new Person("jia");
Person p4 = p3;
Console.WriteLine(p3 == p4);
Console.WriteLine(p3.Equals(p4));
Console.ReadLine();
}
}
}
運(yùn)行程序,會(huì)輸出什么呢?
答案是 true,true,false,true,false,false,true,true。
為什么會(huì)出現(xiàn)這個(gè)答案呢?因?yàn)橹殿愋褪谴鎯?chǔ)在內(nèi)存中的堆棧(以后簡(jiǎn)稱棧),而引用類型的變量在棧中僅僅是存儲(chǔ)引用類型變量的地址,而其本身則存儲(chǔ)在堆中。
==操作比較的是兩個(gè)變量的值是否相等,對(duì)于引用型變量表示的是兩個(gè)變量在堆中存儲(chǔ)的地址是否相同,即棧中的內(nèi)容是否相同。
equals操作表示的兩個(gè)變量是否是對(duì)同一個(gè)對(duì)象的引用,即堆中的內(nèi)容是否相同。
而字符串是一個(gè)特殊的引用型類型,在C#語(yǔ)言中,重載了string 對(duì)象的很多方法方法(包括equals()方法),使string對(duì)象用起來(lái)就像是值類型一樣。
因此在上面的例子中,字符串a(chǎn)和字符串b的兩個(gè)比較是相等的。
對(duì)于object g 和object h 時(shí)內(nèi)存中兩個(gè)不同的對(duì)象,所以在棧中的內(nèi)容是不相同的,故不相等。而g.equals(h)用的是sting的equals()方法故相等(多太)。如果將字符串a(chǎn)和b作這樣的修改:
string a="aa";
string b="aa";
則,g和h的兩個(gè)比較都是相等的。這是因?yàn)橄到y(tǒng)并沒有給字符串b分配內(nèi)存,只是將"aa"指向了b。所以a和b指向的是同一個(gè)字符串(字符串在這種賦值的情況下做了內(nèi)存的優(yōu)化)。
對(duì)于p1和p2,也是內(nèi)存中兩個(gè)不同的對(duì)象,所以在內(nèi)存中的地址肯定不相同,故p1==p2會(huì)返回false,又因?yàn)閜1和p2又是對(duì)不同對(duì)象的引用,所以p1.equals(p2)將返回false。
對(duì)于p3和p4,p4=p3,p3將對(duì)對(duì)象的引用賦給了p4,p3和p4是對(duì)同一個(gè)對(duì)象的引用,所以兩個(gè)比較都返回true。
如果我們對(duì)person的equals方法重寫:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Person
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public Person(string name)
{
this.name = name;
}
public override bool Equals(object obj)
{
if (!(obj is Person))
return false;
Person per = (Person)obj;
return this.Name == per.Name;
}
}
}
那么p1.equals(p2),就會(huì)返回true。
相關(guān)文章
C#靜態(tài)代碼織入AOP組件之Rougamo的使用詳解
Rougamo是一個(gè)靜態(tài)代碼織入的AOP組件,同為AOP組件較為常用的有Castle、Autofac、AspectCore等,下面就跟隨小編一起來(lái)學(xué)習(xí)一下它的具體使用吧2024-01-01C# Winform實(shí)現(xiàn)自定義分頁(yè)控件
一些第三方的分頁(yè)控件要么就是界面不夠美觀大方,要么就是使用起來(lái)感覺很麻煩,所以本文就為大家介紹一下如何利用Winform自定義分頁(yè)控件,需要的可以參考一下2023-07-07C#使用JavaScriptSerializer序列化時(shí)的時(shí)間類型處理
這篇文章主要為大家詳細(xì)介紹了C#使用JavaScriptSerializer序列化時(shí)的時(shí)間類型處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08C#應(yīng)用XML作為數(shù)據(jù)庫(kù)的快速開發(fā)框架實(shí)現(xiàn)方法
這篇文章主要介紹了C#應(yīng)用XML作為數(shù)據(jù)庫(kù)的快速開發(fā)框架實(shí)現(xiàn)方法,詳細(xì)介紹了將XML作為數(shù)據(jù)庫(kù)的C#桌面應(yīng)用開發(fā)技巧,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12C#實(shí)現(xiàn)添加多行文本水印到Word文檔
一般情況下,在Word中添加文字水印僅支持添加一個(gè)文本字樣的水印,由于對(duì)不同文檔的設(shè)計(jì)要求,需要在Word文檔中添加平鋪水印效果。本文將介紹如何來(lái)實(shí)現(xiàn)該水印效果的方法,感興趣的可以了解一下2022-07-07unity實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲
這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03C# Double轉(zhuǎn)化為String時(shí)的保留位數(shù)及格式方式
這篇文章主要介紹了C# Double轉(zhuǎn)化為String時(shí)的保留位數(shù)及格式方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02C#實(shí)現(xiàn)實(shí)體類和XML的相互轉(zhuǎn)換
本文詳細(xì)講解了C#實(shí)現(xiàn)實(shí)體類和XML的相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02