C#中Equals和==的区别 (面试官经常会问到)

首先对于值类型来说,并没有什么区别。区别只针对于引用类型。

一、值类型

   1.对于值类型来说,两者比较的都是“内容”是否相同,也就是值是否相同(值类型只有存在栈上)。

 

二、引用类型

    1.对于引用类型来说,本身的值存在堆中,在栈中存入本身值的引用,可以根据引用找到自己。

    所以:

       对于引用类型来说,==比较的两个变量的”引用“是否一样,也就是“地址”是否一样。而equals比较的是”内容“是否一样。

      1. 比较引用类型:

           

            Person p1 = new Person("aa", 12);

            Person p2 = new Person("aa", 12);

            Console.WriteLine("Equals和= =(等于号)的比较");

            Console.WriteLine("p1==p2  " + (p1 == p2));//结果:false

            Console.WriteLine("p1.Equals(p2)  " + p1.Equals(p2));//结果:false

 

           p1==p2 的结果是false,很简单,因为他们本身是两个不同的变量,引用地址是不同的。

           那么p1.Equals(p2) 为什么是false 呢?

              因为Equlas是object的一个虚方法,而person并没有对其进行重写,此时调用的是父类的Equlas方法,但是父类是不知道p1和p2中有哪些成员的,

          所以返回false。

          如果想让其相等,就要重写父类的Equlas方法,比如:

         

public override bool Equals(object obj)

        {

            Person p = obj as Person;

            //对变量的所有的属性都要进行比较  只有都相同才返回true

            if (this.Age == p.Age && this.Name == p.Name)

            {

                return true;

            }

            else

            {

                return false;

            }

        }

           

         在开发过程中,会经常用到string类型的字段进行Equlas比较,但是比较的结果和==一模一样。比如:

         

           string s1 = "abc";
 
            string s2 = "abc";

            Console.WriteLine("s1==s2 " + (s1 == s2));//true

            Console.WriteLine("s1.Equals(s2) " + s1.Equals(s2));//true

       为什么s1和s2两个不同的变量Euulas比较的结果会相同呢?

  因为string是微软封装的一个字符串类,在内部已经对==操作符进行了重写。重写后比较的是两个变量的值是否相同。

   内部封装如下:

        

public static bool operator == (string a,string b)
{
    return Equals(a,b);
}

      

     因此,对于string类型来说,比较的都是值是否相等。(可以把string当成一个特殊的引用类型)。

      

总结:对于值类型来说,Equlas和==并没有什么区别,比较的都是值是否相等。

          对于引用类型来说,Equlas比较的是值是否相等,==比较的是引用是否相等。string是个特殊的引用类型,内部进行了重写,==比较的是值是否相等。

    

 

posted @ 2019-01-25 18:08  蹦蹦郭  阅读(691)  评论(0编辑  收藏  举报