2012-03-28 4 views
3

У меня здесь глупый вопрос. я определить класс с членами много данных, как это:Как сравнить содержимое двух экземпляров в C#?

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# не может помочь с этим по умолчанию? Или я могу сериализовать этих двух парней и сравнить поток?

спасибо.

+4

Это зависит от того, какое сравнение вы хотите. По умолчанию Equals сравнивают только два экземпляра, а не его содержимое. Переопределите и сравните каждый элемент. – Zenwalker

+0

@zenwalker вам лучше напишите свой комментарий как ответ – Arseny

+0

@Arseny На самом деле это не тот ответ, который ищет OP, я думаю. Плюс тоже не нравится, если вы также забираете вниз: D – Zenwalker

ответ

6

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

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

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

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

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

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

+0

Очень красиво сказал Марк. – Zenwalker

+0

Это просто мысль в моем сознании: сериализатор может рекурсивно обрабатывать мой пользовательский класс, поэтому для этого нужно быть «компаратором». ОК. Меня интересует ваш пример о BinaryFormatter. Спасибо. – bychance

Смежные вопросы