调用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);
}
}
答案 0 :(得分:1)
默认情况下,参数按值传递;它意味着传递的内容实际上是变量的副本(在string
等引用类型的情况下,它是引用的副本)。当func3
分配data
时,它只会修改变量的本地副本。
现在,如果您更改func2
和func3
个签名以便通过引用传递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);
}