2012-03-28 70 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 
} 

現在,我在寫單元測試代碼,並要比較A級 的兩個實例,但我發現這不起作用:

Assert.AreEquals(a1, a2); 

我必須重寫Equals方法來做到這一點? C#默認情況下不能提供幫助? 或者我可以序列化這兩個人並比較文件流?

謝謝。

+4

這取決於你想要什麼樣的比較。默認的Equals只比較兩個實例,而不是它的內容。覆蓋並比較每個項目。 – Zenwalker 2012-03-28 06:25:39

+0

@zenwalker你最好張貼你的評論作爲答案 – Arseny 2012-03-28 06:27:34

+0

@Arseny 它不是真正的答案OP是找我猜。另外,也不喜歡獲得downvoted:D – Zenwalker 2012-03-28 06:28:48

回答

6

對於引用類型,默認的等式實現是引用相等:「這是同一個實例」。對於對等,是的,你應該自己寫,如果你需要的話,但是:它很少真正有用(並且存在問題,因爲如果你覆寫Equals,你也應該覆蓋GetHashCode,並且適當地並行執行)

個人而言,我手動如果此代碼是不是你的主系統的一部分,比較單元測試

列表是一個痛苦過,因爲有三個選項:

  • 同一列表實例
  • 具有相同內容的不同列表實例
  • 不同的名單與相當於內容實例中

你可能指的是最後一個,但也是同樣的問題,重複。

重新序列化:這也很棘手,因爲它取決於序列化器和內容。除非a:您的類型已被用於序列化,否則我不會推薦該路線,而b:您選擇的序列化程序可以保證您的語義。例如,BinaryFormatter不是(我可以提供一個具體的例子,如果你想,但相信我:這不能保證)。

+0

非常好,說馬克。 – Zenwalker 2012-03-28 06:35:54

+0

這只是我的想法:序列化程序可以遞歸地處理我的自定義類,因此必須有一個「比較器」以相同的方式執行它。好。我對你關於BinaryFormatter的例子感興趣。謝謝。 – bychance 2012-03-28 06:43:00

相關問題