0

调用 func1 后,变量 mydata 保持为空。在调试模式下,我看到在 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

4 回答 4

1

默认情况下,参数是按值传递的;这意味着传递的实际上是变量的副本(在引用类型如 的情况下是引用的副本string)。当func3assignsdata时,它只修改变量的本地副本。

现在,如果您更改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关于参数传递的文章以了解更多详细信息。

于 2012-10-17T18:47:08.163 回答
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
}
于 2012-10-17T18:46:55.447 回答
0

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

其次,你为什么把它作为参数传递给各个函数?你这样做的方式,它在每​​个方法中创建一个单独的字符串,并且不引用原始字符串。直接调用它:

private void func3(byte[] arr)
{
    //...
    mydata = new string(a);
}
于 2012-10-17T18:47:39.040 回答
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);
}
于 2012-10-17T18:56:40.757 回答