每次调用Equals都返回false,即使值相同(C#)

Rob*_*tka 1 c# xna compare equals

我在使用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
Run Code Online (Sandbox Code Playgroud)

这个错误必须在我与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;

    }
Run Code Online (Sandbox Code Playgroud)

怎么了?我认为它是在layertiles数组中,但我已经在那里尝试了很多东西,所以我不知道该怎么做.或者是否有其他更简单的方法来解决我的问题?

Ree*_*sey 5

您需要覆盖Object.Equals您的MapSquare类型,以便根据值比较相等性.默认情况下,Object.Equals如果两个变量引用相同的实际实例,则仅返回true - 如果它们具有相同的成员值则不返回true.

如果你打算这样做,我也建议你实施IEquatable<MapSquare>.