Конечно, другие ответы совершенно правильны, но я написал свою версию в соответствии с моими потребностями:
///
/// An equality comparer that compares objects for reference equality.
///
/// The type of objects to compare.
public sealed class ReferenceEqualityComparer : IEqualityComparer
where T : class
{
#region Predefined
private static readonly ReferenceEqualityComparer instance
= new ReferenceEqualityComparer();
///
/// Gets the default instance of the
/// class.
///
/// A instance.
public static ReferenceEqualityComparer Instance
{
get { return instance; }
}
#endregion
///
public bool Equals(T left, T right)
{
return Object.ReferenceEquals(left, right);
}
///
public int GetHashCode(T value)
{
return RuntimeHelpers.GetHashCode(value);
}
}
Обоснование дизайна:
sealed
. Если класс не предназначен для расширения, я собираюсь избежать всех этих расходов, запечатывая его. Эрик Липперт Я знаю многих людей (включая меня), которые считают, что классы действительно должны быть запечатаны default.- Jon Skeet Instance
для чтения только для чтения , чтобы выставить один экземпляр этого класса. Object.ReferenceEquals()
вместо ==
, потому что ReferenceEquals
более явный. RuntimeHelpers.GetHashCode()
, потому что я не хочу использовать возможно переопределенный GetHashCode
объекта , что может не соответствовать поведению ReferenceEquals
. Это также позволяет избежать нулевой проверки.