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'}); 則不一樣,它這是在托管堆上動態分配的地址。
摘自 菜-鳥