为什么数组不是空的?
Why array not turned out to be null?
我对此有点困惑。
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
,它在 'method' 函数中被修改了。数组是引用类型所以没什么奇怪的。
场景 2:k=null
,仍然是我的 p[0]
returns 34
而不是 null
。为什么会这样?在这里我将整个数组设为 null 但第一个元素如何携带 34
?
您正在使对数组的引用为空,而不是使数组为空。如果您将参数更改为 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; //##
}
因为您所做的是将数组的引用传递给 method
,它会创建一个 new
引用 int[] k
,该引用与调用者的变量 p
是, 但不是 p
。
变成 null
的是 method
中的 new
int[] k
,而不是来自调用者的变量 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; //##
}
我对此有点困惑。
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
,它在 'method' 函数中被修改了。数组是引用类型所以没什么奇怪的。
场景 2:k=null
,仍然是我的 p[0]
returns 34
而不是 null
。为什么会这样?在这里我将整个数组设为 null 但第一个元素如何携带 34
?
您正在使对数组的引用为空,而不是使数组为空。如果您将参数更改为 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; //##
}
因为您所做的是将数组的引用传递给 method
,它会创建一个 new
引用 int[] k
,该引用与调用者的变量 p
是, 但不是 p
。
变成 null
的是 method
中的 new
int[] k
,而不是来自调用者的变量 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; //##
}