我在使用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陣列中,但我已經在那裏嘗試了很多東西,所以我不知道該怎麼做。還是有更簡單的方法來解決我的問題?
請務必重寫GetHashCode! –
我認爲Equals比較字段和ReferenceEquals以及==運算符是否指向同一個實例。那是錯的嗎? Equals和ReferenceEquals之間有什麼區別呢?感謝您的幫助:) –
@RobinBetka Equals,對於類,基本上與ReferenceEquals相同,除非您覆蓋它。您需要重寫Object.Equals才能獲得成員比較。 (用一個結構,這是真的,但不是用類)。如果你重寫equals,你通常也應該實現GetHashCode,等等。參見文檔鏈接'IEquatable' –