C#中的Equals()和Contains()


這里討論的是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");

}

}

}

 

若有說的不恰當的地方,請不吝賜教。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM