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

3

我这里有一个愚蠢的问题。 我定义了一个类,其中有许多数据成员,就像这样:

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
}

现在,我正在编写单元测试代码,想要比较两个A类的实例。 但是我发现这样做不起作用:

Assert.AreEquals(a1, a2);

我必须重写Equals方法来实现这个吗?C#默认情况下不能帮助我吗? 或者我可以将这两个对象序列化并比较文件流吗?
谢谢。

4
这取决于你想进行什么类型的比较。默认的Equals只是比较两个实例本身而不是它们的内容。覆盖并比较每一个项目。 - Zenwalker
@zenwalker,你最好把你的评论发表为答案。 - Arseny
@Arseny 我想这并不是提问者想要的答案。而且我也不喜欢被踩 :D - Zenwalker
你可以使用反射来比较值类型属性,但对于引用类型属性则不起作用。同时这可能是 https://dev59.com/inRB5IYBdhLWcg3wz6QJ 的重复问题。 - daryal
1个回答

6
默认的相等性实现对于引用类型是引用相等性:即“这是同一个实例”。如果需要等价性,是的,你应该自己编写,但是:它通常并不是真正有用的(而且存在问题,因为如果你重写了Equals,你也应该以适当的并行实现重写GetHashCode)。
个人而言,在单元测试中手动比较,如果此代码不是你主要系统的一部分。
列表也很麻烦,因为有三种选项:
- 相同的列表实例 - 具有相同内容实例的不同列表 - 具有等效内容实例的不同列表
你可能指的是最后一个,但这是相同的问题,重复出现。
关于序列化:这也很棘手,因为它取决于序列化程序和内容。我不建议采用这种路线,除非a:你的类型已经被用于序列化,并且b:你选择的序列化程序保证了你的意思。例如,BinaryFormatter 不会(如果你想要,我可以提供一个具体的例子,但请相信我:这不能保证)。

这只是我脑海中的一个想法:序列化器可以递归地处理我的自定义类,因此必须有一个“比较器”以相同的方式处理它。好的。我对你关于BinaryFormatter的示例很感兴趣。谢谢。 - bychance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接