IEqualityComparer <T>, который использует ReferenceEquals

Есть ли значение по умолчанию IEqualityComparer<T> реализация, которая использует ReferenceEquals?

EqualityComparer<T>.Default ObjectComparer использования, который использует object.Equals(). В моем случае объекты уже реализуют IEquatable<T>, который я должен проигнорировать и сравнить ссылкой объекта только.

57
задан Liam 7 January 2016 в 11:38
поделиться

1 ответ

На тот случай, если реализации по умолчанию нет, это моя собственная:

Отредактировано 280Z28: Обоснование использования RuntimeHelpers.GetHashCode (object) , который многие из вы, наверное, не видели раньше. :) Этот метод имеет два эффекта, которые делают его правильным вызовом для этой реализации:

  1. Он возвращает 0, когда объект равен нулю. Так как ReferenceEquals работает с нулевыми параметрами, то же самое должно происходить с реализацией компаратора GetHashCode ().
  2. Он вызывает 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
}
56
ответ дан 24 November 2019 в 19:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: