[问题] call by value的问题

楼主: schizophrena (你很記者你很腦殘)   2017-09-01 10:52:42
我写了一个程式
public class classA
{
public int a;
public int b;
public void classA(int _a, int _b)
{
a = _a;
b = _b;
}
}
public class useClassA
{
public callbyValue(classA obj)
{
obj.a = 1;
obj.b = 2;
}
public callbyRef(ref classA obj)
{
obj.a = 3;
obj.b = 4;
}
}
static void Main()
{
classA test_a = new classA(-1,-2);
useClassA test_use = new useClassA();
// test_a.a = -1
// test_a.b = -2
test_use.callbyValue(test_a)
// 照我对C#的理解
// 这时test_a的成员数值在这函式里应该没有被修改
// 所以应该还是维持 -1, -2
test_use.callbyRef(ref test_a);
// 我个人理解
// 这时test_a的成员才会被改成 3,4
}
可是没想到, 在
test_use.callbyValue(test_a)后
test_a里的成员就被改成 1, 2了.....
这和我脑中的call by value和 call by reference的概念不一样呀~~~
有人可以解惑吗?
作者: modog   2017-09-01 11:03:00
class本身就是reference type
楼主: schizophrena (你很記者你很腦殘)   2017-09-01 11:07:00
谢谢
作者: modog   2017-09-01 11:11:00
但用new设值则不会改变原物件 https://goo.gl/5Yt585
作者: s4300026 (s4300026)   2017-09-01 18:18:00
你传入的是class的指标值跟址如果你在方法里面new,call by value是区域变量的值被new, 不影响外面的class,call by ref 是把外面的址复制到区域变量,new会影响外面的class也就是一个是指标,一个是指标的指标,建构起全部都是物件导向的写法,我觉得啦
作者: CloudyWing (孤单ㄉ翼)   2017-09-03 16:34:00
ref type的变量存的是实体位置,所以效果乍看很像你如果在method里把变量设为null或是new一个新物件就看得出差别

Links booklink

Contact Us: admin [ a t ] ucptt.com