BCL 中有几个地方可以使用IEqualityComparer。像Enumerable.Contains或Dictionary Constructor。如果我对默认的比较器不满意,我可以提供我的比较器。
有时我想知道集合是否包含我引用的那个对象。不是在任何其他意义上被视为“平等”的那个。
问题是: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
开心。