程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#參數傳遞時到底發生了什麼二(ref)

C#參數傳遞時到底發生了什麼二(ref)

編輯:C#入門知識

 

ref參數

迫使值參數通過引用傳送給方法。專指值類型對象。

使用前後對比如下:

使用ref前

static void Main(string[] args)

{

    int i = 1;

    Console.WriteLine("方法執行前,i的地址為0x{0:X},值為{1}", (uint)&i, i);

    testMethod(i);

    Console.WriteLine("方法執行後,i的地址為0x{0:X},值為{1}", (uint)&i, i);

    Console.ReadLine();

}

static void testMethod(int i)

{

    i = 2;

    Console.WriteLine("方法執行時,i的地址為0x{0:X},值為{1}", (uint)&i, i);

}

 輸出為:

方法執行前,i的地址為0x4A8E814,值為1

方法執行時,i的地址為0x4A8E7B4,值為2

方法執行後,i的地址為0x4A8E814,值為1

執行過程為:

1)  在棧中新建int i,地址為0x4A8E814,值為1;在棧中新建指針,指向上面的int

2)  執行方法時,在棧中新建int,將i的值復制到新建的int中;新建指針,指向復制的int

3)  方法執行完畢新建int和新建指針均被拋棄(等待垃圾回收)

\

www.2cto.com

使用ref後

 

unsafe class Program

{

    static void Main(string[] args)

    {

        int i = 1;

        Console.WriteLine("方法執行前,i的地址為0x{0:X},值為{1}", (uint)&i, i);

        testMethod(ref i);

        Console.WriteLine("方法執行後,i的地址為0x{0:X},值為{1}", (uint)&i, i);

        Console.ReadLine();

    }

    static void testMethod(ref int i)

    {

        i = 2;

        fixed (int* pI = &(i))

        {

            Console.WriteLine("方法執行時,i的地址為0x{0:X},值為{1}", (uint)&(*pI), (uint)*pI);

        }

    }

}

 輸出為:

方法執行前,i的地址為0x4F5EA84,值為1

方法執行時,i的地址為0x4F5EA84,值為2

方法執行後,i的地址為0x4F5EA84,值為2

執行過程為:

1)  在棧中新建int i,地址為0x4A8E814,值為1;在棧中新建指針,指向上面的int

2)  執行方法時,新建指針,指向i

3)  執行完畢新建指針被拋棄,對i的操作保留

\

 

摘自 掛在牆上的天堂

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