2

これが私の構造です...

internal struct Coord : IEquatable<Coord>
{
    public int X { get; private set; }
    public int Y { get; private set; }

    public Coord(int x,int y) : this(){ X = x;
        Y = y;}

    //Overloaded operator functuions below
    //So I can easily multiply Coords by other Coords and ints and also add Coords together
    public static Coord operator *(Coord left, int right)
    {
        return new Coord(left.X * right, left.Y * right);
    }

    public static Coord operator *(Coord left, Coord right)
    {
        return new Coord(left.X * right.X, left.Y * right.Y);
    }

    public static Coord operator +(Coord left, Coord right)
    {
        return new Coord(left.X + right.X, left.Y + right.Y);
    }

    public static Coord operator -(Coord left, Coord right)
    {
        return new Coord(left.X - right.X, left.Y - right.Y);
    }


    public override int GetHashCode()
    {
        int hash = 17;
        hash = hash * 31 + X;
        hash = hash * 31 + Y;
        return hash;
    }

    public override bool Equals(object other)
    {
        return other is Coord ? Equals((Coord)other) : false;
    }

    public bool Equals(Coord other)
    {
        return X == other.X &&
               Y == other.Y;
    }
}

これらを辞書のキーとして使用していますが、それらが互いに適切に同等であるとは思いません..辞書の値は、bool フィールドを持つオブジェクトです。私はそれらに何かをし、それらがすべてtrueになるまでboolをtrueに変更するwhileループを持っています..それらがtrueに変更されることはないので、無限ループに陥ります..奇妙なのは、範囲外に出ないことです.エラーまたはそのようなもので、ブール値が変更されたビットをデバッグすると正常に動作するように見えますが、デバッグで辞書を見ると、すべてのブール値がまだ偽です

(注: タプルをキーとして使用していましたが、この構造体を作成して、簡単に乗算および加算できるようにしました)

確認したいのですが...

  _myDictionary = new Dictionary<Coord, RogueRoom>();
  _myDictionary[new Coord(4,5)] = new RogueRoom();
  _myDictionary[new Coord(4,5)].Connected = true

同じ値オブジェクトにアクセスしている辞書に 2 回アクセスしますか?

編集:辞書の値構造体は次のとおりです(上記の「もの」を置き換えました)

internal struct RogueRoom
{
    public Room RoomField;
    public bool Connected;
    public Rectangle Realpos;
    public Color[] RogueRoomColors;
    public Coord Gridpos;
}
4

2 に答える 2

2

それは何であるかに依存しThingます。Thingの場合struct: いいえ; 値はフェッチ時にコピーされますが、コンパイラは通常、破棄さstructれようとしている に対してプロパティを割り当てることを停止します。の場合は、同じオブジェクト インスタンスである必要がありclassますあなたの等号/ハッシュコードは合理的に見えます。

于 2013-02-18T16:38:54.343 に答える