C#中Equals()与运算符==区别

 

1、对于值类型:

  如果对象的值相等,则相等运算符==返回True,否则返回False。

2、对于引用类型:

  ==操作符比较的是两个变量的值是否相等,或两个引用是不是指向同一个内存地址。

  equals()方法比较的是两个对象指向的内存空间里的内容是不是相同。equals也就是比较两个“引用类型”是否是对同一个对象的引用。即两个对象的内容是否相等。

    public class ClassPerson
    {
        public ClassPerson(string strname)
        {
            name = strname;
        }
        private string name = null;
        public string Name
        {
            set { name = value; }
            get { return name; }
        }
    }

        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操作表示的是两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

  而字符串是一个特殊的引用型类型,在C#语言中,重载了string对象的很多方法(包括equals()方法),使string对象用起来就像是值类型一样。

  因此在上面的例子中,字符串s3和字符串s4的两个比较是相等的。

  因为object o3和object o4在内存中是两个不同的对象,所以存储的地址(在栈中的内容)是不相同的,故不相等。而o3.Equals(o4)用的是equals()方法,比较的是两个对象存储地址对应的内存空间里的内容,故相等。

  而对于object o1和object o2是相等的。因为系统并没有给字符串s2分配内存,只是将“test”指向了s2。所以s1和s2指向的是同一个字符串(字符串在这种赋值的情况下被做了内存的优化)。

  对于p1和p2,也是内存中两个不同的对象,所以在内存中地地址肯定不相同,故p1==p2会返回False;又因为p1和p2是对不同对象的引用,所以p1.equals(p2)也返回False。

  对于p3和p4,由于p4=p3,p3将对象的引用赋给了p4,p3和p4指向同一地址,是对同一个对象的引用,所以两个比较都返回True。

 

posted on 2013-02-18 10:30  非零  阅读(381)  评论(0编辑  收藏  举报