2012-08-30 183 views
1

我在使用XNA屏幕的Windows窗體應用程序中遇到問題。我想知道在完成多行代碼後,對象是否發生了變化。如果確實如此,則應在標題中添加一個*以告訴用戶文件已更改但尚未保存。即使值相同,調用Equals也會每次返回false(C#)

要做到這一點,我複製對象,並在這些行後面檢查它們是否相等。

MapSquare afterChange = TileMap.GetMapSquareAtPixel((int)mouseLoc.X,(int)mouseLoc.Y); 
MapSquare beforeChange = (MapSquare)afterChange.Clone(); 
// code..... 
if (!Object.Equals(beforeChange,afterChange)) 
parentForm.MapChanged = true; // this happens even when no changes happend 

這個錯誤必須在我與Iclonable接口使用,因爲即使當我檢查等於複製它之後,它不工作,我的克隆方法。

public object Clone() 
    { 
     return new MapSquare(this); 
    } 
private MapSquare(MapSquare squere) 
    { 
     this.LayerTiles = (int[])squere.LayerTiles.Clone(); 
     this.CodeValue = squere.CodeValue; 
     this.Behavior = squere.Behavior; 

    } 

什麼是錯誤?我認爲這是在layerrtiles陣列中,但我已經在那裏嘗試了很多東西,所以我不知道該怎麼做。還是有更簡單的方法來解決我的問題?

回答

5

對於您的MapSquare類型,您需要覆蓋Object.Equals,以便根據值比較相等性。默認情況下,Object.Equals只返回true,如果兩個變量引用相同的實際實例 - 而不是它們具有相同的成員值。

如果您打算這樣做,我也會建議您實施IEquatable<MapSquare>

+1

請務必重寫GetHashCode! –

+0

我認爲Equals比較字段和ReferenceEquals以及==運算符是否指向同一個實例。那是錯的嗎? Equals和ReferenceEquals之間有什麼區別呢?感謝您的幫助:) –

+0

@RobinBetka Equals,對於類,基本上與ReferenceEquals相同,除非您覆蓋它。您需要重寫Object.Equals才能獲得成員比較。 (用一個結構,這是真的,但不是用類)。如果你重寫equals,你通常也應該實現GetHashCode,等等。參見文檔鏈接'IEquatable ' –

1

除非您重載相等運算符,否則您正在測試兩個對象引用是否相等,而不是它們是否包含相同的值。

相關問題