为什么数组不为空?
问题描述:
我对此有点困惑。为什么数组不为空?
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
?
答
因为你做的是传递数组的参考method
,它创建了一个new
参考int[] k
是指同一项目作为呼叫方的可变p
呢,但它不是p
。
什么变得null
是new
int[] k
在method
,不是来自调用方变量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
你*不*通过引用传递。这需要'ref'关键字。如果使用赋值运算符(=),除非通过引用传递,否则它不会影响调用范围中的变量。但是,如果更改常规参数的* properties *和* state *,那么*会更改调用范围中的变量。 –