Есть ли значение по умолчанию IEqualityComparer<T>
реализация, которая использует ReferenceEquals
?
EqualityComparer<T>.Default
ObjectComparer использования, который использует object.Equals()
. В моем случае объекты уже реализуют IEquatable<T>
, который я должен проигнорировать и сравнить ссылкой объекта только.
На тот случай, если реализации по умолчанию нет, это моя собственная:
Отредактировано 280Z28: Обоснование использования RuntimeHelpers.GetHashCode (object)
, который многие из вы, наверное, не видели раньше. :) Этот метод имеет два эффекта, которые делают его правильным вызовом для этой реализации:
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
}