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

首頁 > 編程 > C# > 正文

關于C#函數對象參數傳遞的問題

2024-09-07 17:05:11
字體:
來源:轉載
供稿:網友

    我們知道在.net里class是引用類型,在函數參數表中的對象傳遞的都是對象的引用,所以在函數體內對其對象參數的修改會影響函數外對應的對象本身,例如下面的程序:


    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中修改后的值了。這一點很好理解,運行結果也就是:


 


    如果我們換一種寫法:

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之前的對應關系是:



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


   所以在TestFun函數中,一開始obj指向的還是objA對象。當在TestFun中創建了一個對象objB后,內存模型變為:

 


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

 


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


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



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 嘉定区| 同江市| 鹤峰县| 永德县| 灌阳县| 武山县| 栖霞市| 南宫市| 深圳市| 元谋县| 龙江县| 九江县| 海宁市| 孝感市| 全南县| 龙井市| 察哈| 沙坪坝区| 汤阴县| 盘山县| 象州县| 潼关县| 铁力市| 合川市| 曲水县| 德钦县| 阿坝县| 皋兰县| 神农架林区| 永善县| 巴林左旗| 瑞昌市| 馆陶县| 台东市| 青河县| 全州县| 大足县| 大邑县| 道孚县| 西峡县| 道孚县|