【问题标题】:Why array not turned out to be null? [duplicate]为什么数组没有变成空? [复制]
【发布时间】:2016-03-03 04:39:52
【问题描述】:

我对此有点困惑。

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。为什么会这样?在这里,我将整个数组设置为空,但第一个元素如何携带34

【问题讨论】:

  • 不是通过引用传递。这需要ref 关键字。如果你使用赋值运算符(=),它不会影响调用范围内的变量,除非你通过引用传递。但是,如果您更改常规参数的 propertiesstate,那确实会更改调用范围内的变量。

标签: c# arrays arr


【解决方案1】:

因为您所做的是将数组的引用传递给 method 并创建一个 new 引用 int[] k 引用与调用者变量 p 相同的项目,但它不是 p

变成null 的是new int[] 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; //##
}

【讨论】:

    【解决方案2】:

    您正在使对数组的引用为空,而不是使数组为空。如果您将参数更改为 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; //##
    }
    

    【讨论】:

    • 感谢@rob 不幸的是我能够将一个答案标记为正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 2011-06-13
    • 1970-01-01
    • 2020-10-17
    • 2017-06-03
    • 1970-01-01
    相关资源
    最近更新 更多