有默认的吗IEqualityComparer<T>
使用的实现ReferenceEquals
?
EqualityComparer<T>.Default
使用 ObjectComparer,它使用object.Equals()
。就我而言,对象已经实现了IEquatable<T>
,我需要忽略它并仅通过对象的引用进行比较。
以防万一没有默认实现,这是我自己的:
280Z28 编辑:使用的理由RuntimeHelpers.GetHashCode(object),你们中的许多人可能以前没有见过。 :) 这个方法有两个效果,使其成为correct呼吁实施:
- 当对象为空时,它返回 0。自从
ReferenceEquals
适用于空参数,比较器的 GetHashCode() 实现也应该如此。
- 它调用Object.GetHashCode()非虚拟。
ReferenceEquals
特别忽略任何覆盖Equals
,所以 GetHashCode() 的实现应该使用与 ReferenceEquals 效果相匹配的特殊方法,这正是 RuntimeHelpers.GetHashCode 的用途。
[280Z28结束]
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
/// <summary>
/// A generic object comparerer that would only use object's reference,
/// ignoring any <see cref="IEquatable{T}"/> or <see cref="object.Equals(object)"/> overrides.
/// </summary>
public class ObjectReferenceEqualityComparer<T> : EqualityComparer<T>
where T : class
{
private static IEqualityComparer<T> _defaultComparer;
public new static IEqualityComparer<T> Default
{
get { return _defaultComparer ?? (_defaultComparer = new ObjectReferenceEqualityComparer<T>()); }
}
#region IEqualityComparer<T> Members
public override bool Equals(T x, T y)
{
return ReferenceEquals(x, y);
}
public override int GetHashCode(T obj)
{
return RuntimeHelpers.GetHashCode(obj);
}
#endregion
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)