• 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 和 == 运算符是可以进行重写覆盖的,所以在有些类的对象的表现可能和上述所说的可能表现的不一致

  • 相关阅读:
    Linked List Cycle leetcode java (链表检测环)
    Remove Duplicates from Sorted List II leetcode java
    Remove Duplicates from Sorted List leetcode java
    Merge Two Sorted Lists leetcode java
    Swap Nodes in Pairs leetcode java
    Median of Two Sorted Array leetcode java
    阿里云最便宜的四种域名注册
    nohup和&后台运行,进程查看及终止
    ipv6转ipv4 NAT64与DNS64基本原理概述
    ros使用pppoe拨号获取ipv6,并且下发IPV6的dns到客户机win7
  • 原文地址:https://www.cnblogs.com/weihengblogs/p/2783016.html
Copyright © 2020-2023  润新知