天天看点

C#equals与==的区别

#region
            string s1 = "hello";
            string s2 = "hello";
            char[] ch = { 'h', 'e', 'l', 'l', 'o' };
            Console.WriteLine(s1.Equals(s2));//true
            Console.WriteLine((s1 == s2));//true
            Console.WriteLine(ch.Equals(s2));//false
            Console.WriteLine(ch.ToString() == s2);//false
            Console.WriteLine(ch.ToString().Equals(s2));//false

            string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
            string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
            Console.WriteLine(a == b);//true
            Console.WriteLine(a.Equals(b)); //true
            Console.WriteLine(a == s1);//true
            Console.WriteLine(a .Equals(ch));//false

            object g = a;
            object h = b;
            Console.WriteLine(g == h);//false
            Console.WriteLine(g.Equals(h));//true  引用string的equals

            Person p1 = new Person("张三");
            Person p2 = new Person("张三");
            Console.WriteLine(p1 == p2);//false
            Console.WriteLine(p1.Equals(p2));//false
            //原因:Equals是Object中的一个虚方法,而person类中没有对她进行重写,因此此时调用的仍是父类中的Equals方法。但是父类是无法知道你都有哪些成员字段的,因此返回的是false

            Person p3 = new Person("李四");
            Person p4 = p3;
            Console.WriteLine(p3 == p4);//true
            Console.WriteLine(p3.Equals(p4));//true

            int i = 10;
            int j = 10;
            Console.WriteLine("i,j的equals(内容的)比较" + i.Equals(j));//true
            Console.WriteLine("i,j的==(内容的)比较" + (i == j));//true

            Console.ReadKey();

            #endregion
           

总结:

1、就效率来说,在if语句中判断时,当判断true时,用==;判断false时,用equals

2、值类型:两者比较的都是值(内容)是否相同

3、引用类型:

equals表示的是两个变量(的内容)是否是对同一对象的引用,堆中的内容是否相同

==表示两个变量(的地址)在堆中存储的地址是否相同,即栈中的内容是否相同。

4、对于自定义类而言,equals是父类object 的虚方法,是不知道自定义类的成员,所以equals比较返回false,若要比较两个变量的内容是否相同,应该重写equals方法。