前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >dotnet 使用完全对象引用相等判断

dotnet 使用完全对象引用相等判断

作者头像
林德熙
发布2020-07-07 15:51:03
4710
发布2020-07-07 15:51:03
举报
文章被收录于专栏:林德熙的博客林德熙的博客

默认在列表以及字典哈希这些都会先看对象是否有自己实现的等于判断,如果有就调用对象的。因此对象可以做到两个不同的对象返回相等。而如果需要判断对象引用相等,也就是只有相同的对象才返回相等,此时需要用到 ReferenceEquals 方法。这个判断方法是最快的判断相等的方法,只有在传入的两个参数是相同的对象的时候才会返回 true 的值

那么如何将这个引用相等放在列表或字典哈希等的判断里面?可以看到字典等的构造函数都有重载方法,要求传入 IEqualityComparer 接口,于是可以做如下实现

代码语言:javascript
复制
    class ReferenceEqualsComparer<T> : ReferenceEqualsComparer, IEqualityComparer<T>
    {
        /// <inheritdoc />
        public bool Equals(T x, T y) => ((IEqualityComparer) this).Equals(x, y);

        /// <inheritdoc />
        public int GetHashCode(T obj) => obj.GetHashCode();
    }

    class ReferenceEqualsComparer : IEqualityComparer
    {
        /// <inheritdoc />
        bool IEqualityComparer.Equals(object x, object y) => ReferenceEquals(x, y);

        /// <inheritdoc />
        public int GetHashCode(object obj) => obj?.GetHashCode()??0;
    }

对于字典可以这样使用

代码语言:javascript
复制
        private Dictionary<Lindexi, string> LindexiShiDoubi { get; } =
            // 这里需要使用完全相等的判断,对象完全相等
            new Dictionary<Lindexi, string>(new ReferenceEqualsComparer<Lindexi>());

对于哈希可以这样使用

代码语言:javascript
复制
private HashSet<Lindexi> Lindexi { get; } = new HashSet<Lindexi>(new ReferenceEqualsComparer<Lindexi>());

这样所有进行判断的 Contains 或 ContainsKey 都使用对象引用判断,只有传入和内存里面存放相同的对象才能判断存在

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档