“引用类型”做函数参数,在函数中可以被处理并保留值。比如:
class box
{
public int i = 0;
}
class main
{
private void setbox(box bb)
{
bb.i = 2;
} main()
{
box b = new box();
setbox(b);
MessageBox.Show(b.i.ToString());
}}
这里输出的b.i的值已变为2.
而将一个“值类型”变量,装箱成“引用类型”,却无法通过传递参数来改变值。比如:
class main
{
main()
{
int i = 0;
object box = i;
Set(box); MessageBox.Show(box.ToString());
} private void Set(object aBox)
{
aBox = 2;
}
}
这里输出的box和i的值依然是0.为什么?
class box
{
public int i = 0;
}
class main
{
private void setbox(box bb)
{
bb.i = 2;
} main()
{
box b = new box();
setbox(b);
MessageBox.Show(b.i.ToString());
}}
这里输出的b.i的值已变为2.
而将一个“值类型”变量,装箱成“引用类型”,却无法通过传递参数来改变值。比如:
class main
{
main()
{
int i = 0;
object box = i;
Set(box); MessageBox.Show(box.ToString());
} private void Set(object aBox)
{
aBox = 2;
}
}
这里输出的box和i的值依然是0.为什么?
这种形式是和Class实例化后的内存存放一样的。同样是在堆中放数据。传递给函数时,应该也是传变量的地址,在函数中的更改也是写入地址对应的堆中,并在函数结束后值被保留下来。但实际上却不是这样,令人费解。
------MSDN 这是基础...
private void Set(object aBox)
{
aBox = 2;
}
只是将临时地在堆中新建一个变量副本存放一个2,并让对象box暂时指向(或引用)这个2. 但这个指向的改变是无法保留下来,随着函数的结束,box又指回(或引用)原来的0.代码object box = i;确实是创建了一个引用类型变量box,并在堆中新建一个副本存放一个0.而此时i依然是i,它与新建的box以及box指向的值已没有关系,只是box指向的值copy于i的值.