BCL 中有几个地方可以使用 IEqualityComparer .喜欢Enumerable.Contains或 Dictionary 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.Contains
和 Dictionary
很开心。
最佳答案
据我所知,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/