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

byc*_*nce 3 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<string> NameValue2 { get; set; }
    //...many members
}
Run Code Online (Sandbox Code Playgroud)

现在,我正在编写单元测试代码,并希望比较A类的两个实例.但我发现这不起作用:

Assert.AreEquals(a1, a2);
Run Code Online (Sandbox Code Playgroud)

我必须覆盖Equals方法来做到这一点?默认情况下C#无法解决这个问题?或者我可以序列化这两个人并比较文件流?

谢谢.

Mar*_*ell 6

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

就个人而言,如果此代码不属于您的主系统,我会在您的单元测试中手动比较.

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

  • 相同的列表实例
  • 具有相同内容实例的不同列表
  • 具有等效内容实例的不同列表

你可能意味着最后一个,但这是同样的问题,重复.

重新序列化:这也很棘手,因为它取决于序列化器和内容.我不建议使用该路由,除非:您的类型已经用于序列化,而b:您选择的序列化程序保证您的语义.例如,BinaryFormatter 不是(如果你愿意,我可以提供一个具体的例子,但请相信我:这不能保证).