2013-05-04 100 views
1

我以前遇到過這個問題幾次。下面是一個例子代碼:在C#中運行代碼行後,變量的值會發生變化嗎?

public void moveRight(int x, int y, int rows, int columns) 
    { 
     char[,] imatrix = GameInstance.vexedGame.getLastMatrix(); // <-- creating a variable and initializing it. 
     char letter = imatrix[x, y]; // Doesn't matters 
     char[,] oldMatrix = imatrix; // Creating a new var that is the same as the variable created before 
     if (imatrix[x, (y + 1)] == '-') 
     { 
      //LINE 1 
      GameInstance.vexedGame.setLastMatrix(oldMatrix); //Setting the var of this class to the old matrix (until here everything's fine) 
      imatrix[x, (y + 1)] = letter; 
      imatrix[x, y] = '-'; //Changing the matix 
      //LINE 2 
      GameInstance.vexedGame.setActualMatrix(imatriz); //Setting the actual matrix. 
     } 
    } 

什麼情況是,當我把斷點在整個事情,當我到了// LINE 1,該值保存在矩陣的更改之前的副本。在// LINE 2中進行更改後,不僅imatrix的值發生了變化,而且第一個矩陣的值也發生了變化,所以GameInstance.vexedGame.setLastMatrix發生了變化。我不知道爲什麼會發生這種情況,如果有人能幫助我,我會非常感激。謝謝!

(對不起我的英文不好)

+1

查看您最喜歡的C#編程手冊,並再次閱讀該章節,解釋參考類型和值類型之間的區別。數組是參考類型。 – 2013-05-04 04:06:07

+0

我不知道,謝謝! – avatarbobo 2013-05-04 06:02:24

回答

4

這是因爲它的一個數組,數組是引用類型。

當你

char[,] oldMatrix = imatrix; 

這創造了一個淺拷貝。即存儲器中的地址被傳遞給oldmatrix。現在他們是兩個變量,但是在內存中指向相同的地址。如果你首先改變,第二顯然必須改變。

爲了避免這種情況的使用循環的每個值從第一複製到第二或

做的深層副本。

+0

我該如何解決這個問題?我需要他們在不同的記憶中......哦,等等,我想我必須使用= new char [rows,columns];對? – avatarbobo 2013-05-04 04:10:46

+0

如何進行深層複製?用一個for cicle? – avatarbobo 2013-05-04 04:22:12

1

好的,以便在此處展開​​其他答案。要進行深層複製,您需要手動迭代值並以這種方式分配值,或者使用預先構建的方法。可以工作的東西是Array.CopyTo();,現在這個問題是作爲其一維數組副本出現的,但可以用一些編碼來解決。一個有幫助的稍微不同的幫助函數是Array.Copy();,它意味着複製值的範圍。

它是一維的原因是,沒有說明數據大小在兩個維度內是多麼鋸齒狀。這因此高度依賴於該多維陣列的結構。因此,除非您可以發佈結構以獲得幫助,否則解決此問題將由開發人員來解決。

+0

謝謝!我通過爲cicles創建2來解決這個問題,將所有的值從一個矩陣賦值給另一個,邏輯錯誤消失了。謝謝! – avatarbobo 2013-05-04 06:01:49

相關問題