程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中==與Equals方法的區別

C#中==與Equals方法的區別

編輯:C#入門知識

usingSystem;
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;
        }
    }
    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();
        }
    }
}
輸出結果:true ,true ,false ,true ,false ,false ,true ,true 。
總結如下:
    1、對於值類型,==和equals等價,都是比較存儲信息的內容。
    2、對於引用類型,==比較的是引用類型在棧中的地址,equals方法則比較的是引用類型在托管堆中的存儲信息的內容。www.2cto.com
    3、對於string類要特殊處理,它是一個內部已經處理好了equals方法和==的類,故==和equals等價,都是比較存儲信息的內容。
    4、對於一些自定義的類,我們有必要重載equals方法,否則它默認為基類的equals方法(基類沒有重載Equals方法則為Object類中的Equals方法),他們的比較也為地址,而不是引用類型在托管堆中的存儲信息的內容。
 
故我們就不難理解
以下輸出了:
Person p1 = new Person("jia");
Person p2 = new Person("jia");
Console.WriteLine(p1 == p2);//輸出False
Console.WriteLine(p1.Equals(p2));//輸出False
5、對於string我們有必要強調一下常量字符串與字符串變量的區別,請看一下例子:
// 常量字符串
stringx = "should it matter"; //指向同一個地址,即所謂的常量池
stringy = "should it matter";
object c = x;
object d = y;
Console.WriteLine(c == d);//輸出True
Console.WriteLine(c.Equals(d));//輸出True
// 字符串變量
stringa = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });// 指向的地址不一樣,是動態分配的
stringb = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
object g = a;
object h = b;
Console.WriteLine(g == h);//輸出False
Console.WriteLine(g.Equals(h));//輸出True
他們分配地址的方式不一樣,string x = "should it matter"; 由於它的初始值是一個常量,所以其地址分配在托管堆上的靜態存儲區,即所謂的常量池,而樓主的string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o'}); 則不一樣,它這是在托管堆上動態分配的地址。
  
摘自  菜-鳥
 

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved