我在使用XNA屏幕的Windows窗体应用程序中遇到问题。我想看看在完成多行代码后对象是否发生了更改。如果是,它应该向标题添加*以告诉用户文件确实发生了变化但尚未保存。
要做到这一点,我复制对象,然后在这些行之后检查它们是否相等。
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接口的Clone方法中,因为即使我在复制后立即检查等于它,它也不起作用。
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;
}
错误是什么?我认为它是在layertiles数组中,但我已经在那里尝试了很多东西,所以我不知道该怎么做。或者是否还有其他更简单的方法来解决我的问题?
答案 0 :(得分:5)
您需要覆盖MapSquare
类型的Object.Equals
,以便根据值比较相等性。默认情况下,Object.Equals
仅在两个变量引用相同的实际实例时才返回true - 而不是它们具有相同的成员值。
如果您打算这样做,我建议您同时实施IEquatable<MapSquare>
。
答案 1 :(得分:1)
除非重载相等运算符,否则您将测试两个对象引用是否相等,而不是它们是否包含相同的值。