C#Equals()和運算符==的區別

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回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。

堆和棧的區別可以用如下的比喻來看出: 

使用棧就象我們去飯館裏喫飯,只管點菜(發出申請)、付錢、和喫(使用),喫飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。 

使用堆就象是自己動手做喜歡喫的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章