1

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 メソッドにあるに違いありません。コピーした直後に equals をチェックしても機能しないからです。

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 配列にあると思いますが、すでにいろいろ試しているので、どうすればいいのかわかりません。それとも、私の問題を解決するもっと簡単な方法がありますか?

4

2 に答える 2

5

値に基づいて同等性を比較するには、型Object.Equalsをオーバーライドする必要があります。MapSquareデフォルトでObject.Equalsは、2 つの変数が同じ実際のインスタンスを参照している場合にのみ true を返します。同じメンバー値を持っている場合ではありません。

これを行う予定がある場合は、も実装することをお勧めIEquatable<MapSquare>します。

于 2012-08-30T23:32:42.987 に答える
1

等価演算子をオーバーロードしない限り、2 つのオブジェクト参照が等しいかどうかをテストしており、同じ値が含まれているかどうかをテストしていません。

于 2012-08-30T23:32:49.500 に答える