[問題] call by value的問題

看板C_Sharp (C#)作者 (你很記者你很腦殘)時間7年前 (2017/09/01 10:52), 編輯推噓4(408)
留言12則, 4人參與, 最新討論串2/2 (看更多)
我寫了一個程式 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的概念不一樣呀~~~ 有人可以解惑嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.216.55.178 ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1504234365.A.EAA.html

09/01 11:03, , 1F
class本身就是reference type
09/01 11:03, 1F

09/01 11:07, , 2F
謝謝
09/01 11:07, 2F

09/01 11:11, , 3F
但用new設值則不會改變原物件 https://goo.gl/5Yt585
09/01 11:11, 3F

09/01 18:18, , 4F
你傳入的是class的指標值跟址
09/01 18:18, 4F

09/01 18:26, , 5F
如果你在方法裡面new,call by value是區域變數的值被ne
09/01 18:26, 5F

09/01 18:26, , 6F
w, 不影響外面的class,call by ref 是把外面的址複製
09/01 18:26, 6F

09/01 18:26, , 7F
到區域變數,new會影響外面的class
09/01 18:26, 7F

09/01 18:28, , 8F
也就是一個是指標,一個是指標的指標,建構起全部都是
09/01 18:28, 8F

09/01 18:28, , 9F
物件導向的寫法,我覺得啦
09/01 18:28, 9F

09/03 16:34, , 10F
ref type的變數存的是實體位置,所以效果乍看很像
09/03 16:34, 10F

09/03 16:35, , 11F
你如果在method裡把變數設為null或是new一個新物件就
09/03 16:35, 11F

09/03 16:35, , 12F
看得出差別
09/03 16:35, 12F
文章代碼(AID): #1PgCjzwg (C_Sharp)
文章代碼(AID): #1PgCjzwg (C_Sharp)