asp.net(C#)函數(shù)對象參數(shù)傳遞的問題
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作為參數(shù)傳遞給函數(shù)TestFun,這時傳遞的是對象objA的引用,所以在函數(shù)內(nèi)對objA的修改會直接應(yīng)用到這個對象本身。在函數(shù)TestFun內(nèi)修改了形參obj的Name屬性,所以在Main中再調(diào)用objA.Name時這個屬性值就變?yōu)樵赥estFun中修改后的值了。這一點很好理解,運行結(jié)果也就是:

如果我們換一種寫法:
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; }
}
}
那結(jié)果又將如何呢? 在TestFun中新創(chuàng)建了一個對象objB,接著將obj指向新創(chuàng)建的對象objB并對其的Name屬性賦值,所以在TestFun函數(shù)體里Console.WriteLine的時候obj.Name應(yīng)該是“I am ObjB”。那在Main里調(diào)用了TestFun(objA)后objA指向的對象到底做了改變沒有,它仍舊指向原來的對象還是已經(jīng)指向了在TestFun里創(chuàng)建的objB呢?
我的猜測是這樣的,將objA傳遞給TestFun傳遞的實際是objA的地址,在調(diào)用TestFun之前的對應(yīng)關(guān)系是:

objA是個變量,他本身的地址是000001,它存放的是objA對象的地址00E001。當(dāng)調(diào)用函數(shù)TestFun(objA)時,由于要將objA作為參數(shù)傳遞給TestFun,所以在
棧中就復(fù)制一個objA地址的副本,這個副本的地址為000003,他存放的仍舊是objA對象的地址00E001,如圖:

所以在TestFun函數(shù)中,一開始o(jì)bj指向的還是objA對象。當(dāng)在TestFun中創(chuàng)建了一個對象objB后,內(nèi)存模型變?yōu)椋?
TestFun中執(zhí)行“obj=objB”后,obj指向objB對象,如下圖:
所以執(zhí)行完TestFun函數(shù)后,Main函數(shù)中objA仍舊指向原來的objA對象,故運行結(jié)果如下:
注:本文中的內(nèi)存模型僅是個人猜測,肯定有不正確或者不嚴(yán)謹(jǐn)?shù)牡胤?,希望不要誤導(dǎo)大家,也歡迎指正。
相關(guān)文章
Asp.Net MVC3.0如何項目部署到Win7 64位系統(tǒng)
這篇文章主要介紹了Asp.Net MVC3.0如何項目部署到Win7 64位系統(tǒng)的全部過程,需要的朋友可以參考下2015-10-10時間輕松學(xué)會.NET Core操作ElasticSearch7的方法
這篇文章主要介紹了時間輕松學(xué)會.NET Core操作ElasticSearch7,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04asp.net Repeater顯示父子表數(shù)據(jù),無閃爍
兩天在改項目bug,發(fā)現(xiàn)以前有人做的repeater顯示父子表結(jié)構(gòu)展開和關(guān)閉子表數(shù)據(jù)時總是有閃爍,于是就試著改成無閃爍的,成功了,與大家分享.2009-12-12js獲取.aspx頁面里面的服務(wù)器控件和.ascx中的服務(wù)器控件值
用js獲取.ascx控件中服務(wù)器控件值時首先要得到服務(wù)器控件的ClientID再加上.ascx頁面里面的服務(wù)器空間ID并用"_"連接2009-02-02asp.net 大文件上傳 之 改版了的SlickUpload.HttpUploadModule(Krystalware
以下代碼中所注釋的部分是所改版的地方。:) Krystalware.SlickUpload.dll2009-05-05