为什么数组不为空?

问题描述:

我对此有点困惑。为什么数组不为空?

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 *,那么*会更改调用范围中的变量。 –

因为你做的是传递数组的参考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; //## 
} 

您正在对数组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