调用函数后,c#类变量仍为null

时间:2012-10-17 18:43:59

标签: c# class variables

调用func1变量后,mydata保持为null。在调试模式中,我看到在func3中它将数据设置为字符串。退出函数后为什么没有传递值?
类示例

class myclass
{
    public string mydata;

    public int func1()
    {

        //....
            func2(/**/, mydata);
        //....
        return 1;
    }


    private int func2(/**/,data)
    {
        byte[] arr = new byte[1000];
            //...
                func3(arr,data);
            //...
        return 1;
    }


    private void func3(byte[] arr, string data)
    {
        char[] a = new char[100];
        //...

        data = new string(a);
    }

}

4 个答案:

答案 0 :(得分:1)

默认情况下,参数按值传递;它意味着传递的内容实际上是变量的副本(在string等引用类型的情况下,它是引用的副本)。当func3分配data时,它只会修改变量的本地副本。

现在,如果您更改func2func3个签名以便通过引用传递data,您将获得预期的结果:

public int func1()
{

    //....
        func2(/**/, ref mydata);
    //....
    return 1;
}


private int func2(/**/,ref string data)
{
    byte[] arr = new byte[1000];
        //...
            func3(arr, ref data);
        //...
    return 1;
}


private void func3(byte[] arr, ref string data)
{
    char[] a = new char[100];
    //...

    data = new string(a);
}

我建议您阅读Jon Skeet的article about parameter passing了解更多详情。

答案 1 :(得分:0)

因为所有参数都通过引用传递给方法。 data = new string(a); 创建带有新引用的字符串的新实例。

var o = new object(); // reference 1

function void method(object something)
{
   // here we have reference to something in stack, so if we will assign new value to it, we will work with stack copy of a reference.
   something = null; // we removed reference to something in method not initial o instance
}

答案 2 :(得分:0)

首先,它是实例变量,而不是变量。要成为一个类变量,必须声明static

其次,为什么要把它作为各自职能的论据?你这样做的方式,它在每​​个方法中创建一个单独的字符串,而不是指原始方法。请继续直接致电:

private void func3(byte[] arr)
{
    //...
    mydata = new string(a);
}

答案 3 :(得分:0)

您按值传递对字符串mydata的引用。这意味着在函数返回后,mydata仍会引用同一个对象,无论您在函数内部执行什么操作。如果您想更改字符串mydata,可以通过引用传递引用:

public int func1()
{
    //....
        func2(/**/, ref mydata);
    //....
    return 1;
}

private int func2(/**/, ref string data)
{
    byte[] arr = new byte[1000];
        //...
            func3(arr, ref data);
        //...
    return 1;
}

private void func3(byte[] arr, ref string data)
{
    char[] a = new char[100];
    //...

    data = new string(a);
}