Как сравнить содержимое двух экземпляров в C #? - PullRequest
3 голосов
/ 28 марта 2012

У меня тут глупый вопрос. Я определяю класс со многими членами данных, например:

public class A
{
    public string Name { get; set; }
    public double Score { get; set; }
    //...many members
    public C Direction { get; set; }
    public List<B> NameValue1 { get; set; }
    public List<string> NameValue2 { get; set; }
    //...many members
}

Теперь я пишу код модульного теста и хочу сравнить два экземпляра класса А. Но я обнаружил, что это не работает:

Assert.AreEquals(a1, a2);

Я должен переопределить Equals метод, чтобы сделать это? C # не может помочь с этим по умолчанию? Или я могу сериализовать этих двух парней и сравнить поток файлов?

Спасибо.

1 Ответ

6 голосов
/ 28 марта 2012

Реализация равенства по умолчанию для ссылочных типов - это ссылочное равенство: «это тот же самый экземпляр».Для эквивалентности, да, вы должны написать это сами, если вам это нужно, но: на самом деле это не так уж и полезно (и есть проблема, потому что если вы переопределяете Equals, вы должны переопределить также GetHashCode с подходящей параллельной реализацией.

Лично я бы сравнил вручную в вашем модульном тесте, если этот код не является частью вашей основной системы.

Списки также являются проблемой, так как есть три варианта:

  • один и тот же экземпляр списка
  • разные списки с одинаковыми экземплярами контента
  • разные списки с эквивалентными экземплярами контента

Вывероятно, означают последнее, но это та же самая проблема, повторенная.

Повторная сериализация: это тоже сложно, так как это зависит от сериализатора и содержимого. Я бы не рекомендовал этот маршрут, если: ваш типуже используется для сериализации, и b: выбранный вами сериализатор гарантирует семантику, которую вы имеете в виду. Например, BinaryFormatter не (я могу дать конкретный примересли хочешь, но поверь мне: это не гарантировано).

...