2016-03-03 67 views
1

我對此有點困惑。爲什麼數組不爲空?

private void button1_Click(object sender, EventArgs e) 
{ 
    int i = 1; 
    int[] p=new int[4]; 
    p[0] = 25; 
    method(p); 
    string o = p[0].ToString(); 
} 
private void method(int[] k) 
{ 
    k[0] = 34; 
    k = null; //## 
} 

場景1:如果我刪除k=null,那麼我的p[0]原來作爲34這是在「方法」函數修改。數組是引用類型,所以沒什麼好奇怪的。

場景2:與k=null,仍然我的p[0]返回34而不是null。爲什麼是這樣?在這裏,我把整個數組作爲null,但第一個元素仍然如何攜帶34

+2

你*不*通過引用傳遞。這需要'ref'關鍵字。如果使用賦值運算符(=),除非通過引用傳遞,否則它不會影響調用範圍中的變量。但是,如果更改常規參數的* properties *和* state *,那麼*會更改調用範圍中的變量。 –

回答

1

因爲你做的是傳遞數組的參考method,它創建了一個new參考int[] k是指同一項目作爲呼叫方的可變p呢,但它不是p

什麼變得nullnewint[] kmethod,不是來自調用方變量p

int i = 1; 
int[] p=new int[4]; //p is here 
p[0] = 25; 
method(p); 
string o = p[0].ToString(); 

//this is k, it is a new int[] reffering to the same item as p, but not p 
private void method(int[] k) 
{ 
    k[0] = 34; 
    k = null; //## 
} 
1

您正在對數組null引用,因爲您沒有將該數組設置爲null。如果您將參數更改爲ref int[] k並將其稱爲method(ref p),那麼它的行爲將與您所期望的相同。

例如:

private void button1_Click(object sender, EventArgs e) 
{ 
    int i = 1; 
    int[] p=new int[4]; 
    p[0] = 25; 
    method(ref p); 
    string o = p[0].ToString(); 
} 
private void method(ref int[] k) 
{ 
    k[0] = 34; 
    k = null; //## 
} 
+1

感謝@rob,不幸的是我能夠將一個答案標記爲正確。 – thoniv