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

        

  • 相关阅读:
    POJ1182
    poj3225 线段树区间操作 (见鬼)
    斜率优化dp(POJ1180 Uva1451)
    POJ2528 线段树的区间操作
    POI2001 Gold mine(二叉排序树 黑书经典)
    POJ3921
    博弈论之威佐夫博弈(转载)
    poj3468(线段树 边覆盖)
    hdu 1166(树状数组 或 线段树)
    压缩软件的改进--- (续先前霍夫曼编码)
  • 原文地址:https://www.cnblogs.com/BounceGuo/p/10320873.html
Copyright © 2020-2023  润新知