c# 中的Equals()和==有什么区别?

对于值类型引用类型来说比较过程
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Person
    {
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public Person(string name)
        {
            this.name = name;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            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);
            Console.WriteLine(a.Equals(b));

            object g = a;
            object h = b;
            Console.WriteLine(g == h);
            Console.WriteLine(g.Equals(h));

            Person p1 = new Person("jia");
            Person p2 = new Person("jia");
            Console.WriteLine(p1 == p2);
            Console.WriteLine(p1.Equals(p2));

            Person p3 = new Person("jia");
            Person p4 = p3;
            Console.WriteLine(p3 == p4);
            Console.WriteLine(p3.Equals(p4));
            Console.ReadLine();
        }
    }
}
答案true true false true  false false true true
值类型存储内存堆栈简称栈)引用类型变量仅仅存储引用类型变量地址而其本身则存储
一般来说:
  "==" : 操作, 对于值类型,比较变量否相等;对于引用型变量表示变量存储地址否相同即栈内容否相同
  "equals" : 操作表示变量是否是对同对象引用即堆内容否相同
    
而字符串特殊引用型类型C#语言重载了string 对象多方法方法(包括equals()方法)使string对象用起来值类型
    因此上面例子对输出 ,字符串a和字符串b比较相等
    对于 第二对输出 object g = a 和object h = b ,  内存对象内容相同相等而g.equals(h)用stingequals()方法故相等(多态)字符串a和b作修改:
        string a="aa";
        string b="aa";
则g和h比较都相等系统并没有给字符串b分配内存"aa"指向了ba和b指向字符串(字符串种赋值情况下做了内存优化
对于p1和p2内存对象内存地址肯定相同故p1==p2会返回false又因p1和p2又同对象引用p1.equals(p2)返回false
对于p3和p4p4=p3p3对对象引用赋给了p4p3和p4对同对象引用比较都返回true

MSDN概括了 Equals 方法和等号运算符 (==) 实现准则:

每次实现 Equals 方法时都实现 GetHashCode 方法使 Equals 和 GetHashCode 保持同步

每次实现相等运算符 (==) 时都重写 Equals 方法使们执行同样操作使用 Equals 方法基础结构代码( Hashtable 和 ArrayList)与用相等运算符编写用户代码相同

每次重写 Equals 方法时都实现相等运算符 (==)

引用类型实现相等运算符 (==)
大多数语言确实引用类型提供默认相等运算符 (==) 实现因此引用类型实现相等运算符 (==) 时应小心大多数引用类型(即使实现 Equals 方法引用类型)都应重写相等运算符 (==)

好了下面考题相信答案大家都知道了

            Console.WriteLine((2 + 2) == 4); //True, 值类型,值相等
            object s = 1;
            object t = 1;
            Console.WriteLine(s == t);          //False
            Console.WriteLine(s.Equals(t));  //True, 值类型封装的依旧比较值;            


            string a = "hello";
            string b = String.Copy(a);
            string c = "hello";


            Console.WriteLine(a == b);                                               //True, 记住,String当做值类型比较, 因为针对String类的特殊处理
            Console.WriteLine(Object.Equals(a, b));                           //True, 同上
            Console.WriteLine((object)a == (object)b);                       //False, 引用的是不同对象
            Console.WriteLine(Object.Equals((object)a, (object)b));   //True,  多态,调用String的Equals方法
            Console.WriteLine((object)a == (object)c);                       //True, 字符串的内存优化,两个"Hello"指向同一内存空间
            Console.WriteLine(Object.Equals((object)a, (object)c));   //True, 多态,调用String的Equals方法
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值