【2019】比较的方法对比: ==/Equals/ReferenceEqual

比较的方法对比: ==/Equals/ReferenceEqual
      #region 值和值类型及引用的比较
      public void _AToA()
      {
          //定义:静态相等符号,对应存在的!=,这个符号是一个可以重载的二元操作符,可以用于比较两个对象是否相等。使用==比较对象时,C#在编译时就决定了所比较的类型,而且不会执行任何虚方法(Object.Equals)。这是大家所期望的相等行比较。
          //对于内置值类型,==判断的是两个对象的代数值是否相等。它会根据需要自动进行必要的类型转换,并根据两个对象的值是否相等返回true或者false
          //对于引用类型,则==一般情况下比较的这是引用类型的引用是否相等。
          //注意:但是某些内置的引用类型重载了==符号,例如string就重载==,使其比较的不是两个字符串的引用,而是比较的两个字符串字面量是否相等,如下图,所以对于引用类型最好不要使用==符号进行相等性比较,避免混淆。【对于引用类型利用==除了string是比较其值外,其余都是比较其引用,因为string是经常需要操作,所以会直接比较其值,所以会对其特殊对待,所以如果遇见特殊的引用类型需要查看一下是否进行了==重载,默认情况大家都可以把==在比较引用类型时当成比较引用!】
          ///值类型的==比较:虽然i和j在栈上具有不同的内存空间,但是他们的代数值都为5;m和n类型被自动转换并比较代数值
          int i = 5;
          int j = 5;
          Console.WriteLine(i == j);//值类型比较代数值 输出True
          int m = 6;
          double n = 6.0;
          Console.WriteLine(m == n);//类型自动转换并比较数值 输出True
          //引用类型==比较:如下代码,两个object对象都在堆上申请了空间,在线程栈上存在两个不同的引用,所以输出结果为False
          object obj1 = new object();
          object obj2 = new object();
          Console.WriteLine(m == n);//类型自动转换并比较数值 输出False
          return;
      }
      public void _Equals()
      {
          //比较的是值类型和值
          //定义:Equals属于Object的实例方法,用于比较两个对象的引用是否相等,注意:对于Object对象比较的是引用!
          //然而对于值类型,类型相同(不会进行类型自动转换),并且数值相同(对于struct的每个成员都必须相同),则Equals返回 true,否则返回false。这是为什么呢?                 
          //这是因为内置的值类型都重写了Object.Equals方法,所以值类型的Equals方法与引用类型的Equals就产生了不同的效果。
          //Equals在程序运行时决定比较的类型--根据对象的实际类型进行比较,根据对象的类型调用他们各自的Equals虚方法。
          int i = 5;
          int j = 5;
          Console.WriteLine(i.Equals(j));//值类型比较 输出True
          int m = 6;
          double n = 6.0;
          Console.WriteLine(m.Equals(n));//类型不会自动转换并比较数值 输出False
          object obj1 = new object();
          object obj2 = new object();
          Console.WriteLine(obj2.Equals(obj1));//引用类型比较 输出False
          Console.WriteLine(obj2.Equals(string.Empty));//输出False,比较量对象的类型不同直接返回False   
          return;
      }
      public void _ReferenceEqual()
      {
          //定义:Object的静态方法,比较两对象的引用是否相等,值类型和引用类型都是一样。
          int i = 5;
          int j = 5;
          Console.WriteLine(object.ReferenceEquals(i, j));//输出False //值相等值类型相同引用类型不一样
          int m = 6;
          double n = 6.0;
          Console.WriteLine(object.ReferenceEquals(m, n));//输出False //值相等值类型不相同引用类型不一样
          object obj1 = new object();
          object obj2 = new object();
          Console.WriteLine(object.ReferenceEquals(obj1, obj2));//输出False 
          return;
      }
      #endregion

          int i1 = new Int32();
          int i2 = new Int32();
          object.ReferenceEquals(i1, i2);
          #region 装箱和拆箱是一个抽象的概念
          //装箱:将值类型转化为引用类型
          int i = 10;
          object j = i;
          //拆箱:将引用类型转化为值类型
          //int t = 10;
          object m= 10;
          int n = (int)m;
          
          #endregion
          #region ' ==, Equals,ReferenceEquals 的阐述 '
          ///== 值的代数比较
          _AToA();
          /// Equals
          _Equals();
          ///ReferenceEquals
          _ReferenceEqual();

          string t1 = "abc";
          string t2 = "abc";
          object.ReferenceEquals(t1,t2);
          #endregion
···

Result:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值