国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > .NET > 正文

asp.net(C#)函數(shù)對(duì)象參數(shù)傳遞的問(wèn)題

2020-01-18 00:59:58
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
復(fù)制代碼 代碼如下:

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; }
}
}

將對(duì)象objA作為參數(shù)傳遞給函數(shù)TestFun,這時(shí)傳遞的是對(duì)象objA的引用,所以在函數(shù)內(nèi)對(duì)objA的修改會(huì)直接應(yīng)用到這個(gè)對(duì)象本身。在函數(shù)TestFun內(nèi)修改了形參obj的Name屬性,所以在Main中再調(diào)用objA.Name時(shí)這個(gè)屬性值就變?yōu)樵赥estFun中修改后的值了。這一點(diǎn)很好理解,運(yùn)行結(jié)果也就是:
image
如果我們換一種寫(xiě)法:
復(fù)制代碼 代碼如下:

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)建了一個(gè)對(duì)象objB,接著將obj指向新創(chuàng)建的對(duì)象objB并對(duì)其的Name屬性賦值,所以在TestFun函數(shù)體里Console.WriteLine的時(shí)候obj.Name應(yīng)該是“I am ObjB”。那在Main里調(diào)用了TestFun(objA)后objA指向的對(duì)象到底做了改變沒(méi)有,它仍舊指向原來(lái)的對(duì)象還是已經(jīng)指向了在TestFun里創(chuàng)建的objB呢?

我的猜測(cè)是這樣的,將objA傳遞給TestFun傳遞的實(shí)際是objA的地址,在調(diào)用TestFun之前的對(duì)應(yīng)關(guān)系是:
image
objA是個(gè)變量,他本身的地址是000001,它存放的是objA對(duì)象的地址00E001。當(dāng)調(diào)用函數(shù)TestFun(objA)時(shí),由于要將objA作為參數(shù)傳遞給TestFun,所以在
棧中就復(fù)制一個(gè)objA地址的副本,這個(gè)副本的地址為000003,他存放的仍舊是objA對(duì)象的地址00E001,如圖:
image
所以在TestFun函數(shù)中,一開(kāi)始o(jì)bj指向的還是objA對(duì)象。當(dāng)在TestFun中創(chuàng)建了一個(gè)對(duì)象objB后,內(nèi)存模型變?yōu)椋?

  image

  TestFun中執(zhí)行“obj=objB”后,obj指向objB對(duì)象,如下圖:

image

  所以執(zhí)行完TestFun函數(shù)后,Main函數(shù)中objA仍舊指向原來(lái)的objA對(duì)象,故運(yùn)行結(jié)果如下:

image

 

本文中的內(nèi)存模型僅是個(gè)人猜測(cè),肯定有不正確或者不嚴(yán)謹(jǐn)?shù)牡胤?,希望不要誤導(dǎo)大家,也歡迎指正。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 丰镇市| 通海县| 闽侯县| 荥经县| 清水县| 邻水| 枞阳县| 察隅县| 宜宾县| 辽宁省| 商河县| 五华县| 瓮安县| 墨脱县| 西峡县| 漳浦县| 仙居县| 周至县| 闻喜县| 芦山县| 澄城县| 延津县| 天津市| 石门县| 永德县| 桐乡市| 来凤县| 定结县| 博野县| 嘉兴市| 鄢陵县| 桂东县| 土默特左旗| 绥江县| 安远县| 新晃| 盘山县| 涟水县| 揭西县| 玉田县| 柘城县|