這里討論的是List<T>的Contains方法,Contains方法默認調用類型T的Equals方法
而Object類的Equals方法支持值類型的比較和引用類型的比較,即如果繼承自Object的類是引用類型的(C#中的所有類都繼承自Object類),那么該類的Equals就比較是否引用了同一個對象。相反Struct結構體是值類型的,它的Equals方法使用值類型比較。
C#中的String類比較特殊,唯獨此類不符合上面的規定。雖然String為引用類型,但比較時使用值類型的比較方法。
string s = new string('d',2);
string x = "dd";
s.Equals(x)的值為true
所以一般情況下C#中可以把string當成是值類型。
有一點需要注意,當Equals進行值類型的比較兩個struct結構體時,對於其內部的字段,也會根據字段的類型使用值比較或者引用比較,不會因為是在比較兩個結構體而對其中所有的字段都進行值的比較。
舉例說明:下面是用到的結構體和類
struct A { public B x; } class B { string str; public B(string str) { this.str = str; } }
第一種嘗試,結果打印出OK:
class Program
{
static void Main()
{
B b = new B("3");
A a = new A();
a.x = b;
A aa = new A();
aa.x = b;
if (a.Equals(aa))
{
Console.WriteLine("OK");
}
}
}
第二種嘗試,結果沒有打印出任何東西:
class Program
{
static void Main()
{
A a = new A();
a.x = new B("3");
A aa = new A();
aa.x = new B("3");
if (a.Equals(aa))
{
Console.WriteLine("OK");
}
}
}
若有說的不恰當的地方,請不吝賜教。