• C#中的Equals、RefrenceEquals和==的区别


    equals()和==的区别:

    一、对象类型不同

    1、equals():是超类Object中的方法。

    2、==:是操作符。

    二、比较的对象不同

    1、equals():用来检测两个对象是否相等,即两个对象的内容是否相等。

    2、==:用于比较引用和比较基本数据类型时具有不同的功能。

    三、运行速度不同

    1、equals():没有==运行速度快。

    2、==:运行速度比equals()快,因为==只是比较引用。

    ReferenceEquals

    ReferenceEquals是Object类的一个静态方法,在任何时候都是比较引用是否相等

    在比较如果比较的类型是值类型是,因为ReferenceEquals 的形参列表是Object类型所以在调用的时候存在一个装箱过程,

    所以用来比较值类型是没有意义的,一直返回的是false

    Equals

    针对引用引用类型比较的是对象的引用地址,

    针对值类型的话比较的是对象的值,

    如果是自定义值类型如果要进行比较的话最好重写一下这个方法:

    复制代码
     1     public abstract class ValueType
     2     {
     3         [__DynamicallyInvokable, SecuritySafeCritical]
     4         public override bool Equals(object obj)
     5         {
     6             if (obj == null)
     7             {
     8                 return false;
     9             }
    10             RuntimeType runtimeType = (RuntimeType)base.GetType();
    11             if ((RuntimeType)obj.GetType() != runtimeType)
    12             {
    13                 return false;
    14             }
    15             if (ValueType.CanCompareBits(this))
    16             {
    17                 return ValueType.FastEqualsCheck(this, obj);
    18             }
    19             FieldInfo[] fields = runtimeType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
    20             for (int i = 0; i < fields.Length; i++)
    21             {
    22                 object obj2 = ((RtFieldInfo)fields[i]).UnsafeGetValue(this);
    23                 object obj3 = ((RtFieldInfo)fields[i]).UnsafeGetValue(obj);
    24                 if (obj2 == null)
    25                 {
    26                     if (obj3 != null)
    27                     {
    28                         return false;
    29                     }
    30                 }
    31                 else if (!obj2.Equals(obj3))
    32                 {
    33                     return false;
    34                 }
    35             }
    36             return true;
    37         }
    复制代码

    可以看到默认的实现是使用了反射原理比较了两个值的所有字段

    ==

    针对C#默认的值类型是比较的是对象的值,对于自定义值类型是没有默认的实现的

    针对引用类型比较的是引用地址

    Equals 和 == 运算符是可以进行重写覆盖的,所以在有些类的对象的表现可能和上述所说的可能表现的不一致

  • 相关阅读:
    Intellij IDEA调试功能使用总结
    193.数据库备份和恢复
    191.数据安全性控制
    192.数据完整性管理
    190.事务管理与并发控制
    189.存储过程和触发器
    云笔记项目-笔记列表弹出"分享移动删除"子菜单
    使用JavaMail发送邮件-从FTP读取图片并添加到邮件正文发送
    二进制学习
    云笔记项目-网页端debug功能学习
  • 原文地址:https://www.cnblogs.com/weihengblogs/p/2783016.html
Copyright © 2020-2023  润新知