2015-09-27 127 views
0

我正在創建一個縱橫字謎遊戲,並且似乎在網格系統中有一個簡單的座標變量分配問題。 我有一個非常簡單的結構來保存離散座標值,如下所示。我已經剝離了封裝以便於閱讀。C#爲什麼鏈接列表類變量在賦值後不保留其值?

public struct vec2 
    { 
     public int x, y; 
     public vec2(int x, int y) 
     { 
      this.x = x; 
      this.y = y; 
     } 
    } 

這VEC 2結構保持一個類的內部持有字值

public struct WordClass 
{ 
    string svalue; 
    bool flag; 
    public vec2 position; 

    public WordClass(string sarg, bool barg) 
    { 
     this.svalue = sarg; 
     this.flag = barg; 
     position = new vec2(0,0); 
    } 
    public string StringVal 
    { 
     get { return svalue; } 
    } 
    public bool FlagVal 
    { 
     get { return flag; } 
    } 
    public void DisableWord() 
    { 
     if (this.flipflop == false) 
     { 
      this.flipflop = true; 
     } 
    } 
    public void SetPos(int xa, int ya) 
    { 
     this.position.x = xa; 
     this.position.y = ya; 
    } 
} 

這應該基本保持永久的單詞列表與使用的標誌,和可變位置系統會自動計算最佳這個詞的位置。

我有話

List<WordClass> WordList = new List<WordClass>(); 

,並改變一個詞的座標在單詞表的動態鏈表

//Arbitrary values 
    WordList[0].SetPos(Position_X, Position_Y); 

現在我的問題是,當我嘗試使用的位置這個詞,不管我把它設置得太早,它的默認值都是0,0。在做其他功能時,我一直在撓頭腦,並且留下了我想知道我是否缺少重要的東西。任何幫助將是偉大的,謝謝。

+0

檢出[「何時使用結構?」](http://stackoverflow.com/q/521298/382780)。你的結構是可變的,在你試圖設置一個值的時候會導致這樣的問題,但它不會「粘住」,因爲你實際上正在改變結構副本上的值。我認爲你不應該在這裏使用結構。 – 31eee384

+0

歡呼的鏈接,我仍然是一個業餘程序員,我認爲類和Structs完全可以在C#中互換。這似乎主要解決了我的問題。 –

回答

0

問題似乎與vec2ValueObject並且您正在嘗試更改它有關。有問題的線路具體是這兩個:

this.position.x = xa; 
this.position.y = ya; 

爲什麼?由於vec2是一個struct每次你讀它時,你會得到一個臨時副本,然後修改該副本,然後副本被扔掉,而你仍然在閱讀原始的,未修改的。這就是儘可能多的價值對象應該是不可變的原因之一,除非你有很強的理由。

的第一步應該是作出正確不變vec2結構:

public struct vec2 
{ 
    public int x { get; private set; } 
    public int y { get; private set; } 

    public vec2(int x, int y) 
    { 
     this.x = x; 
     this.y = y; 
    } 
} 

一旦你得到了這一點,你需要照顧的修飾在SetPos方法。由於結構是不變的,你可以不再讀它,而是每次需要改變它的時候,你會扔當前實例路程,創建一個新:

public void SetPos(int xa, int ya) 
{ 
    this.position = new vec2(xa, ya); 
} 

這將創建一個全新的結構和將其分配到包含新值的內部領域。由於這並沒有真正嘗試修改結構,而是改變了新結構的結構,所以它不會受到相同的細微錯誤的影響。

+1

_''''''''每次讀取結構時都會得到一個臨時copy_你確定它發生在_that具體case_中嗎?請注意,我們有'List ','WordClass'也是'struct'。 – AlexD

+0

爲此乾杯,配合我在@ 31eee384提出的問題上的評論,完全解決了我的問題。這與臨時副本和結構有關。 –

+0

@AlexD這隻會加劇問題,所以臨時複製問題可能會發生*兩次*。我沒有仔細檢查,但仍然存在可變結構的問題。也就是說,當我有一個編譯器時,我會測試:D – Alejandro