程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> ASP.NET基礎 >> asp.net(C#)函數對象參數傳遞的問題

asp.net(C#)函數對象參數傳遞的問題

編輯:ASP.NET基礎
復制代碼 代碼如下:
class Program
{
static void Main(string[] args)
{
TestClass objA = new TestClass();
objA.Name = "I am ObjA";

Console.WriteLine(String.Format("In Main:{0}", objA.Name));

TestFun(objA);

Console.WriteLine(String.Format("In Main:{0}", objA.Name));

Console.Read();
}

static void TestFun(TestClass obj)
{
obj.Name = "I am be modified in TestFun";
Console.WriteLine(String.Format("In TestFun:{0}", obj.Name));
}

public class TestClass
{
public string Name { get; set; }
}
}

將對象objA作為參數傳遞給函數TestFun,這時傳遞的是對象objA的引用,所以在函數內對objA的修改會直接應用到這個對象本身。在函數TestFun內修改了形參obj的Name屬性,所以在Main中再調用objA.Name時這個屬性值就變為在TestFun中修改後的值了。這一點很好理解,運行結果也就是:
image
如果我們換一種寫法:
復制代碼 代碼如下:
class Program
{
static void Main(string[] args)
{
TestClass objA = new TestClass();
objA.Name = "I am ObjA";

Console.WriteLine(String.Format("In Main:{0}", objA.Name));

TestFun(objA);

Console.WriteLine(String.Format("In Main:{0}", objA.Name));

Console.Read();
}

static void TestFun(TestClass obj)
{
TestClass objB = new TestClass();
obj = objB;
obj.Name = "I am ObjB";
Console.WriteLine(String.Format("In TestFun:{0}", obj.Name));
}

public class TestClass
{
public string Name { get; set; }
}
}

那結果又將如何呢? 在TestFun中新創建了一個對象objB,接著將obj指向新創建的對象objB並對其的Name屬性賦值,所以在TestFun函數體裡Console.WriteLine的時候obj.Name應該是“I am ObjB”。那在Main裡調用了TestFun(objA)後objA指向的對象到底做了改變沒有,它仍舊指向原來的對象還是已經指向了在TestFun裡創建的objB呢?

我的猜測是這樣的,將objA傳遞給TestFun傳遞的實際是objA的地址,在調用TestFun之前的對應關系是:
image
objA是個變量,他本身的地址是000001,它存放的是objA對象的地址00E001。當調用函數TestFun(objA)時,由於要將objA作為參數傳遞給TestFun,所以在
棧中就復制一個objA地址的副本,這個副本的地址為000003,他存放的仍舊是objA對象的地址00E001,如圖:
image
所以在TestFun函數中,一開始obj指向的還是objA對象。當在TestFun中創建了一個對象objB後,內存模型變為:

  image

  TestFun中執行“obj=objB”後,obj指向objB對象,如下圖:

image

  所以執行完TestFun函數後,Main函數中objA仍舊指向原來的objA對象,故運行結果如下:

image

 

本文中的內存模型僅是個人猜測,肯定有不正確或者不嚴謹的地方,希望不要誤導大家,也歡迎指正。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved