1.對於值類型
如果對象的值相等,則相等運算符==返回True,否則返回False
2.對於引用類型
equals方法比較的是兩個對象指向的內存空間內容是不是相同。也就是比較兩個引用類型是否是對同一個對象的引用,即兩個對象的內容是否相等。
對於string類型,==比較字符串的值
對於引用類型,==操作符類似於比較的是文件夾的路徑是否相同,而equals方法比較的是文件夾中的內容是不是一樣。
using System;
namespace Equals和等號的區別
{
class ClassPerson
{
private string name=null;
public ClassPerson(string strname)
{
name = strname;
}
public string Name
{
set { name = value; }
get { return name; }
}
}
class Program
{
static void Main(string[] args)
{
string s1 = "test";
string s2 = "test";
Console.WriteLine(s1 == s2); //True
Console.WriteLine(s1.Equals(s2)); //True
object o1 = s1;
object o2 = s2;
Console.WriteLine(o1 == o2);//True
Console.WriteLine(o1.Equals(o2));//True
string s3 = new string(new char[] { 't', 'e', 's', 't' });
string s4 = new string(new char[] { 't', 'e', 's', 't' });
Console.WriteLine(s3 == s4);//True
Console.WriteLine(s3.Equals(s4));//True
object o3 = s3;
object o4 = s4;
Console.WriteLine(o3 == o4);//False
Console.WriteLine(o3.Equals(o4));//True
ClassPerson p1 = new ClassPerson("ltp");
ClassPerson p2 = new ClassPerson("ltp");
Console.WriteLine(p1 == p2);//False
Console.WriteLine(p1.Equals(p2));//False
ClassPerson p3 = new ClassPerson("ltp");
ClassPerson p4 = p3;
Console.WriteLine(p3 == p4);//True
Console.WriteLine(p3.Equals(p4));//True
}
}
}
因爲值類型是存儲在內存中的堆棧(以下簡稱棧),而引用類型的變量在棧中僅僅是存儲引用類型變量的地址,而其本身則存儲在堆中。
==操作比較的是兩個變量的值是否相等,對於引用型變量表示的是兩個變量在堆中存儲的地址是否相同,即棧中的內容是否相同。
equals操作表示的是兩個變量是否是對同一個對象的引用,即堆中的內容是否相同。
1、棧區(stack)― 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。 2、堆區(heap) ― 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。
堆和棧的區別可以用如下的比喻來看出: 使用棧就象我們去飯館裏喫飯,只管點菜(發出申請)、付錢、和喫(使用),喫飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。 使用堆就象是自己動手做喜歡喫的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。