【问题标题】:How to compare two instances' contents in C#?如何在 C# 中比较两个实例的内容?
【发布时间】:2012-03-28 06:24:09
【问题描述】:

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

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# 对此无能为力吗? 或者我可以序列化这两个家伙并比较文件流?

谢谢。

【问题讨论】:

  • 这取决于你想要什么样的比较。默认的 Equals 仅比较两个实例而不是其内容。覆盖并比较每个项目。
  • @zenwalker 你最好发表你的评论作为答案
  • @Arseny 我猜这并不是 OP 正在寻找的答案。另外也不喜欢被否决:D
  • 您可以使用反射来比较值类型属性,但对于引用类型属性,这不起作用。 stackoverflow.com/questions/506096/… 也可能重复

标签: c# serialization compare equals


【解决方案1】:

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

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

列表也很痛苦,因为有三个选项:

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

您可能是指最后一个,但这是同一个问题,重复。

重新序列化:这也很棘手,因为它取决于序列化程序和内容。我不会推荐这条路线,除非 a: 你的类型已经被用于序列化,并且 b: 你选择的序列化器保证了你的意思。例如,BinaryFormatter 没有(如果你愿意,我可以提供一个具体的例子,但相信我:这不能保证)。

【讨论】:

  • 这只是我的一个想法:序列化器可以递归处理我的自定义类,所以必须有一个“比较器”以同样的方式来做。好的。我对您有关 BinaryFormatter 的示例感兴趣。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多