2015-01-31 34 views
0

在我的井字遊戲我有一個數組聲明循環如下:通過數組c#

static char[] boardArray = new char[9]{ '0', '1', '2', '3', '4', '5', '6', '7', '8'}; 

而且我有一個

private static void resetBoard(ref char[] arr) 
{ 
for(int i = 0; i < 9; i++) { 
    arr[i] = (char)i; 
    } 
} 

然而,當我把這個方法:

resetBoard(ref boardArray); 

它將所有數組值設置爲空字符。 這是爲什麼發生?

+2

那應該是'new char [9] {...}'? – clcto 2015-01-31 20:45:28

+0

奇怪的是,你的boardArray是5的長度,而你試圖放入9個元素 – Mysterion 2015-01-31 20:45:44

+4

@Mysterion:我猜測OP輸入這個而不是複製。這也可以解釋數組聲明後神祕的'b'。 – siride 2015-01-31 20:46:53

回答

4

我沒有將它們設置爲空,而是將其設置爲ASCII值0-9,這與字符'0' - '9'非常不同。

你想要什麼:

for(int i = 0; i < arr.Length; i++) 
{ 
    arr[i] = (char)(i + '0'); 
} 

順便說一下,

  • 你不需要ref這裏,數組是引用類型。
  • 使用arr.Length更爲清晰可辨,並可能更快
+0

不是「ASCII」,unicode代碼點。 – 2015-01-31 20:43:10

+0

這與ASCII相同。我們不要混淆事物。 – 2015-01-31 20:43:52

+0

並使用'arr.Length'確保你不會出現在編輯 – clcto 2015-01-31 20:48:03

1

有幾件事情是怎麼回事。 (1)您不需要使用ref。無論如何,通過引用有效地傳遞數組。這意味着,對於函數的調用者來說,在接受數組的函數中所做的任何更改都是顯而易見的。沒有複製。 (2)您正在將代碼0到8分配給您的數組(ASCII代碼實際上是Unicode,但這裏沒有關係)。我假設你想要實際的數字,這將是別的東西。在這種情況下,使用此代碼來代替,該整數i轉換爲字符串,並得到該字符串的第一個字符(只會有反正一個字符):

arr[i] = i.ToString()[0]; 

(3)確保使用arr.Length在您的for循環中,因爲它允許您更改陣列的大小,而不必更新for循環中的代碼。一般來說,避免在代碼中使用除01之外的常量(與所有規則一樣,有很多例外情況)。

+0

不是「ASCII」,unicode代碼點。 – 2015-01-31 20:43:37

+1

@ LasseV.Karlsen:這並不重要。 – siride 2015-01-31 20:43:49

+0

Downvoter謹慎解釋? – siride 2015-01-31 20:45:05

1

簡單的回答,請使用arr[i] = char.Parse(i.ToString());而不是arr[i] = (char)i;