• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

一、值类型

   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是个特殊的引用类型,内部进行了重写,==比较的是值是否相等。

    

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
开始学习和研究GNU的经典C和C++库发布时间:2022-07-14
下一篇:
C-CatchThatCow发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap