c# - .NET 中是否有任何类型的 "ReferenceComparer"?

标签 c# .net comparison base-class-library

BCL 中有几个地方可以使用 IEqualityComparer .喜欢Enumerable.ContainsDictionary Constructor .如果我对 default 不满意,我可以提供比较器一。

有时我想知道该集合是否包含我引用的那个对象。不是在任何其他意义上被认为是“平等”的那个。
问题是:BCL 中是否存在仅依赖于ReferenceEquals 的标准相等比较器?方法?

我自己写的是这样的:

class ReferenceComparer<T> : IEqualityComparer<T> where T : class
{
    private static ReferenceComparer<T> m_instance;

    public static ReferenceComparer<T> Instance
    {
        get
        {
            return m_instance ?? (m_instance = new ReferenceComparer<T>());
        }
    }

    public bool Equals(T x, T y)
    {
        return ReferenceEquals(x, y);
    }

    public int GetHashCode(T obj)
    {
        return RuntimeHelpers.GetHashCode(obj);
    }
}

我没有彻底测试它,也没有考虑很多场景,但它似乎让 Enumerable.ContainsDictionary 很开心。

最佳答案

据我所知,BCL 没有公开任何实现 IEqualityComparer<T> 的公共(public)类型从 .NET 4.0 开始具有引用相等性。

但是,确实有很多内部类型可以执行此操作,例如:

  • System.Dynamic.Utils.ReferenceEqualityComparer<T> (在 System.Core 中)
  • System.Xaml.Schema.ReferenceEqualityComparer<T> (在 System.Xaml 中)。

我用反射器查看了这两种类型的实现,您会很高兴知道它们的实现方式似乎与您的几乎相同,除了他们不对静态实例使用惰性初始化(他们在类型的静态构造函数中创建它)。

对于您的实现,我能想到的唯一可能的“问题”是惰性初始化不是线程安全的,但由于实例“便宜”并且不保持任何状态,因此不应创建任何错误或主要性能问题。不过,如果您想强制执行单例模式,则必须正确执行。

关于c# - .NET 中是否有任何类型的 "ReferenceComparer"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4901320/

相关文章:

c# - 杀死与文件流一起使用的任务的正确方法是什么

.net - 基于 Microsoft 的现代标准技术堆栈是什么样的?

asp.net - 使属性可反序列化但不可序列化

MySQL:选择两个数据库中时间戳不匹配的所有行

Python:max/min 内置函数取决于参数顺序

c# - Win10 构建 : Loading assembly failed

c# - RedirectToAction 不适用于 Tempdata - ASP.net core MVC

c# - Regex.Replace 无法按预期使用 Regexoptions.IgnoreCase

.net - 如何跨 VS 版本制作一致的 dll 二进制文件?

string - 多文本比较算法