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的操作保留
摘自 掛在牆上的天堂