c#和java的值傳遞和引用傳遞問題
阿新 • • 發佈:2019-01-08
往往我們在程式設計時會思考傳進方法體內的物件是引用傳遞還是值傳遞
我們先看看java是怎麼玩的
public class Class1 {
public int i = 0;
public void pr()
{
System.out.println(i);
}
}
public class Main { public static void main(String[] args) { Class1 c1 = new Class1(); c1.i = 9; System.out.println(c1.i); test(c1); System.out.println(c1.i); Class1 c2 = c1; c1 = null; c2.pr(); c1.pr(); } public static void test(Class1 cc) { //cc = new Class1(); cc.i = 10; } }
輸出結果
9
10
10
異常
去掉
//cc = new Class1();
註釋
輸出
9,
9
9
異常
對比下c#的程式碼:
public class Class1 { public int i = 0; public void pr() { Console.WriteLine(i); } } private void button1_Click(object sender, EventArgs e) { Class1 c1 = new Class1(); c1.i = 9; Console.WriteLine(c1.i); test(c1); Console.WriteLine(c1.i); Class1 c2 = c1; c1 = null; c2.pr(); c1.pr(); } public void test(Class1 cc) { //cc = new Class1(); cc.i = 10; }
點選button後輸出內容為以下:
9
10
10
異常
去掉
//cc = new Class1();
這段程式碼的註釋我們再看看結果
9
9
9
異常
綜上不難看出一個問題,兩者在處理物件實際上都是值傳遞,但是在記憶體使用時你感覺是傳的引用,因為地址值沒有變化,只是在指向的記憶體的內容上產生了變化
關鍵的步驟如下圖所示:
在test不new如下
第一步:
c1出現並將資訊傳給cc,此時cc也指向9
第二步:
cc將指向的內容改為10,執行完成cc銷燬,c2和c1指向同一內容
第三步:
此時c1和cc均已無效
test裡new物件流程如下:
第一步:
此時cc和c1指向內容相同
第二步
cc指向新物件c1還是老的
第三步:
由於c1內容沒有發生修改c2和c1都是9
第四步:
c1置null後銷燬c2為有效資訊
但是我們看下c#加了ref後的效果
private void button1_Click(object sender, EventArgs e)
{
Class1 c1 = new Class1();
c1.i = 9;
Console.WriteLine(c1.i);
test(ref c1);
Console.WriteLine(c1.i);
Class1 c2 = c1;
c1 = null;
c2.pr();
c1.pr();
}
public void test(ref Class1 cc)
{
cc = new Class1();
cc.i = 10;
}
輸出結果:
9
10
10
異常
分析圖如下:
第一步:
第二步:
第三步:
第四步:
以上內容僅供參考,是我自己的理解。不對請大神們指點,非常感謝!!!!!