如何比较两个实例';C#中的内容?

如何比较两个实例';C#中的内容?,c#,serialization,compare,equals,C#,Serialization,Compare,Equals,我有一个愚蠢的问题。 我定义了一个包含许多数据成员的类,如下所示: 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

我有一个愚蠢的问题。 我定义了一个包含许多数据成员的类,如下所示:

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
}
我必须重写
Equals
方法才能这样做?默认情况下,C#无法帮助解决这个问题? 或者我可以序列化这两个人并比较文件流


谢谢。

对于引用类型,默认的相等实现是引用相等:“这是同一个实例吗?”。对于等价性,是的,如果需要的话,您应该自己编写,但是:它很少真正有用(这是一个问题,因为如果覆盖
Equals
,您也应该覆盖
GetHashCode
,并使用适当的并行实现

就个人而言,如果此代码不是主系统的一部分,我会在单元测试中手动进行比较

列表也是一种痛苦,因为有三种选择:

  • 同一列表实例
  • 具有相同内容实例的不同列表
  • 具有等效内容实例的不同列表
你可能是指最后一个,但这是同一个问题,重复


重新序列化:这也很棘手,因为它取决于序列化程序和内容。我不建议采用这种方法,除非a:您的类型已用于序列化,b:您选择的序列化程序保证您所指的语义。例如,
BinaryFormatter
(如果你愿意,我可以提供一个具体的例子,但相信我:这不是保证).

这取决于您想要的比较类型。默认值等于只比较两个实例,而不是其内容。覆盖并比较每个项目。@zenwalker您最好以answer@Arseny我想这并不是OP想要的答案。另外,我也不喜欢被否决:你可以使用反射to比较值类型属性,但对于引用类型属性,这不起作用。我的想法是,序列化程序可以递归地处理我的自定义类,因此必须有一个“比较器”以同样的方式进行处理。好的。我对您关于BinaryFormatter的示例感兴趣。谢谢。
Assert.AreEquals(a1, a2);