2017-03-03 53 views
-2

好的,所以我正在嘗試製作這個小型控制檯遊戲,並且我正在使用一個名爲position的課程用於敵人和玩家。 position包含xy值。爲了移動,我正在制定一種方法 - 首先我只是爲了玩家,但現在我正在努力讓它適用於每個位置。無法更改方法C中的變量#

public static void move2(int x, int y, position pos) 
    { 
     position newpos = new position() 
     { 
      X = pos.X + x, 
      Y = pos.Y + y 
     }; 
     if (possiblemove(newpos)) 
     { 
      pos = newpos; 
      Console.WriteLine(" " + pos.X +" "+ pos.Y + "<old pos - new pos >" + newpos.X +" " + newpos.Y); 
      Console.ReadLine(); 

的事情是,當我嘗試設置posnewpos,它並沒有改變,與以前相同的值保持。即使我寫了pos = newpos,writeline給了我2個不同的值。如果我使用某個職位,比如我的playerpos,那麼如果一個變量工作的很好。

我在編程方面很新穎,不知道這是爲什麼。

如果有辦法解決這個問題,我願意接受建議,這就是爲什麼我把它發佈在這裏的原因。

+1

'posistion'是一個類還是一個struct? – Amy

+1

顯示'位置'的定義。 – hatchet

回答

0

我認爲,重構你的代碼來實現你追求的最簡單的方法,可能是東西

pos = newpos; 

這樣的::更換此行

pos.X = newpos.X; 
pos.Y = newpos.Y; 
1

pos不通過引用傳遞,因此將其設置爲新值僅在move2內更改了對其的本地引用。考慮引用傳遞它,而不是:

public static void move2(int x, int y, ref posistion pos) 

你必須添加ref到調用代碼,也

+0

看起來他在同一個函數「move2」中記錄它。 – Amy

+0

@Amy是的,但最有可能的'pos'是結構體,因此它的值不存在於'move2'範圍之外 – kuskmen

+0

@kuskmen爲什麼「外部'move2'範圍」*重要*如果他將它記錄在函數中? – Amy

0

能你發佈你的Position類/結構的定義?我只是寫了你的代碼,並且按照我的預期工作。

如果你奇怪地聲明瞭原始變量,它也可能有助於在你調用Move方法的地方看到代碼。

namespace PositionTest 
{ 
    class Program 
    { 
     static void Main(string[] args) { 
      Position mobpos = new Position { X = 1, Y = 2 }; 
      move(1, 4, mobpos); 
     } 

     public static void move(int x, int y, Position pos) { 
      Position newpos = new Position { X = pos.X + x, Y = pos.Y + y }; 

      pos = newpos; 
      Console.WriteLine(" " + pos.X + " " + pos.Y + "<old pos - new pos >" + newpos.X + " " + newpos.Y); 
      Console.ReadLine(); 
     } 

    } 

    class Position 
    { 
     public int X { get; set; } 
     public int Y { get; set; } 
    } 
} 

Output:  2 6<old pos - new pos >2 6 

編輯:從您的意見之一,我看你聲明的位置的X和Y屬性爲靜態的。刪除靜態關鍵字,並且您的程序可能工作。

1

當您將引用類型傳入沒有ref關鍵字的方法中時,該方法可以修改您的對象(例如,添加或移除傳遞列表中的項目),但無法將其重新分配給另一個對象。

這意味着在調用方法之前和之後,調用方將始終訪問相同的對象(即使通過方法修改)。
正如Tim提到的那樣,加入ref關鍵字可以改變這一點,因此引用也可以改變。

0

因爲你的類X/Y是靜態的屬性,如對蒂姆的回答您的評論指出,中posistion所有實例將共享X和Y的相同值試想一下:

posistion posA = new posistion 
{ 
    X = 1, 
    Y = 2 
}; 

posistion posB = new posistion 
{ 
    X = 3, 
    Y = 4 
}; 

Console.Writeline($"{posA.X}/{posA.Y} - {posB.X}/{posB.Y}") 

什麼你期望的結果是?那麼,直觀地說,它應該1/2 - 3/4,對吧?但是,如果這是你的posistion定義:

public class posistion 
{ 
    public static X { get; set; } 
    public static Y { get; set; } 
} 

也就是說你會從代碼的第一個片段觀察行爲。會發生什麼是,您創建第一個實例,其屬性是12。但是,當您創建第二個實例時,它與每個其他實例共享相同的屬性,因爲屬性爲static ...因此它會覆蓋posistion(因爲它們都共享相同的屬性)的每個其他實例中的屬性。

嘗試從X的定義中刪除static關鍵字,看看會發生什麼。每個實例都會有一個不同的X

那麼你的代碼中發生了什麼?您使用新值創建了newPos ...,並且這些值重寫了pos中的值,使每個值與其他值不可區分。

這裏的正確解決方法是:a)瞭解static的工作方式,以及b)刪除static關鍵字。