2013-02-18 1 views
2

Heres는 내 구조체 ...사용하여 구조체

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 필드가있는 객체입니다. 나는 그들이 사실이 될 때까지 그들에게 물건을하고 bool을 바꿔주는 while 회 돌이를가집니다 .. 그들은 진실로 바뀌지 않으므로 무한 루프에 갇히게됩니다. 이상한 것은 무엇이든 나가지 못한다는 것입니다. 범위 오류 또는 그와 같은 것 그리고 bool이 바뀌는 비트를 디버깅 할 때 잘 동작하는 것처럼 보이지만 디버그에서 사전을 볼 때 모든 bool은 여전히 ​​false이다.

(참고 : 나는 Tuple을 다음과 같이 사용했다. 키는하지만 난

난 그냥 당신이 확인하고 싶은) 증식 쉽게 추가 할 수 있도록이 구조체 만든 ...

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

그 두 번 내가 같은 값 개체에 액세스 오전 사전에 액세스 할 수 있습니까?

편집 : 여기에 사전에 값 구조체입니다 그것은 Thing이 무엇인지에 따라 달라집니다

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

정확히 일치하지 않는 짧은 예를 보여주세요. –

+3

구조가 나에게 잘 보입니다. 오류는 다른 곳에 있어야합니까? == 그들을 사용하여 어디서나 비교할 수 있습니까? 연산자 ==() –

+0

아니요, 그냥 키로 사용한 다음 값 객체의 bool에 ==를 사용했습니다. –

답변

2

(I "는 것은"위의 대체). Thingstruct 인 경우 : 아니요. 컴파일러는 대개 버려 질 것 인 struct에 대한 속성 할당을 중지하지만 값은 반입 될 때 복사됩니다. class 인 경우 이 동일한 객체 인스턴스 여야합니다. 귀하의 평등/해시 코드는 합리적인 것처럼 보입니다.

1

성명 _myDictionary[new Coord(4,5)].Connected = true;은 반환 유형이 구조체 (예 : _myDictionary[new Coord(4,5)]) 인 메소드 및 속성이 해당 구조 유형의 읽기 전용 사본을 반환하고 해당 읽기 전용 구조에 쓰려고하기 때문에 컴파일하지 말아야합니다.

간결함을 위해 나는 당신의 사전을 가장 할 것입니다. Dictionary<int, RogueRoom>; Coordinate이 사용자 정의 구조라는 사실은 여기서 중요하지 않습니다.

var temp = _myDictionary[5];이라고 말하면 RogueRoom 인스턴스의 쓰기 가능 복사본이 생성됩니다. temp.Connected=true;이라고 말하면 을 복사하고을 복사하지만 사전은 변경되지 않은 채로 둡니다. 사전에 저장된 내용을 업데이트하려면 _myDictionary[5] = temp;으로 직접 작성해야합니다. 당신이 변경 가능한 클래스에 RogueRoom을 변경한다면

, 당신은 또한 어떤과 관련된 Connected 속성을 수정 것 _myDictionary[5].Connected = true; 그러나, 좋든 나쁘 5와 관련된 개체의 Connected 속성을 수정하기 위해 말할 수 동일한 객체에 존재하는 다른 참조. 예를 들어 _MyDictionary[2] = _MyDictionary[5];이라고 말하면 _myDictionary[5].Connected = true; 문은 2와 연결된 객체의 connected 속성을 설정합니다 (2와 연결된 객체는 5와 동일한 객체이기 때문에).

어떤 사람들은 가변 구조를 싫어하고, 그 코드를 말해야 할 것입니다, 그래서 당신은 당신의 유형을 설계해야한다고 제안 뭔가 같은 : 대신 tempConnected 속성을 업데이트하고 다시 작성

var temp = _myDictionary[5]; 
_myDictionary[5] = new RogueRoom(temp.RoomField, true, temp.RealPos, 
    temp.RogueRoomColors, temp.GridPos); 

. 후자의 스타일은 불필요하게 추악하고 어둡게 느껴지지만 어떤 사람들은 그것을 선호합니다.

유형이 각기 다른 저장 위치에있는 유형과 독립적 인 정보를 보유하도록 유형 RogueRoom의 각 저장 영역을 원하는지 여부에 따라 클래스가되어야하는지 여부에 대한 질문은 또는 해당 유형의 여러 저장 영역 위치가 동일한 인스턴스를 참조 할 수 있는지 여부를 지정하십시오. 두 시나리오 모두에 대한 명확한 사용 사례가 있습니다. 당신은 당신에게 맞는 것을 결정할 필요가 있습니다.