a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 編程 > C# > 正文

關(guān)于C#函數(shù)對(duì)象參數(shù)傳遞的問(wèn)題

2024-09-07 17:05:11
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

    我們知道在.net里class是引用類(lèi)型,在函數(shù)參數(shù)表中的對(duì)象傳遞的都是對(duì)象的引用,所以在函數(shù)體內(nèi)對(duì)其對(duì)象參數(shù)的修改會(huì)影響函數(shù)外對(duì)應(yīng)的對(duì)象本身,例如下面的程序:


    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é)果也就是:


 


    如果我們換一種寫(xiě)法:

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)系是:



   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,如圖:


   所以在TestFun函數(shù)中,一開(kāi)始o(jì)bj指向的還是objA對(duì)象。當(dāng)在TestFun中創(chuàng)建了一個(gè)對(duì)象objB后,內(nèi)存模型變?yōu)椋?/p>

 


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

 


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


注:本文中的內(nèi)存模型僅是個(gè)人猜測(cè),肯定有不正確或者不嚴(yán)謹(jǐn)?shù)牡胤剑M灰`導(dǎo)大家。



發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 一级日韩片 | 中文字幕123伦 | 四虎影视 | av一区二区在线观看 | 中文字幕在线日韩 | 精品久久久久久 | 成人在线免费视频观看 | 一区二区三区精品 | 天堂在线中文字幕 | www.成人| 国产精品欧美日韩在线观看 | 国产一区二区三区免费 | 久久久久久a女人 | 毛片免费视频 | 日本久久久久久 | 精品一二三区在线观看 | 亚洲伊人影院 | 四虎最新影视 | 欧美日韩在线免费 | 亚洲精品一二区 | 中文字幕免费在线观看 | av国产精品 | 欧产日产国产精品一二 | 999精品视频 | 成人在线一区二区三区 | 欧美成人黄激情免费视频 | 亚洲精品免费在线观看 | 国产精品免费视频观看 | 99精品国产在热久久 | 精品国产一区二区三区久久久 | 精品亚洲一区二区三区 | 久爱国产 | 一级欧美| 免费黄色毛片视频 | 一区二区精品在线观看 | 在线国产区 | 少妇一区二区三区毛片免费下载看 | av解说在线精品 | 日韩欧美一区在线 | 久久久久极品 | 国产精品系列在线播放 |