一直以來對於在引用類型前加ref傳遞變量和不加ref傳遞引用類型變量的區別不是很清楚,最近看到網上一個朋友給的一道題,仔細思索和編寫代碼測試,終於明白其中區別了。現整理如下,以供自己和朋友們理解和記憶。
ref是使變量通過引用的方式傳遞,而引用類型本身也是通過引用方式傳遞變量,所以一直糾結在這兩者的區別?經過思考、查證資料以及編寫代碼證實,兩者的區別在於:
引用類型前不加ref時,只能修改所引用對象的值,而不能對所引用對象的引用進行更改。
而在引用類型前加ref時,不僅可以修改所引用對象的值,也可以改變對所引用對象的引用。
通過下面測試代碼,能夠很好的反映出來。代碼中使用了非安全代碼(指針),通過使用指針顯示對象的內存地址,可以觀察出對對象引用的變化。
不加ref傳遞:
1 class Value
2 {
3 public int i = 15;
4 }
5 class Program
6 {
7 static unsafe void Main(string[] args)
8 {
9 Program t = new Program();
10 t.first();
11 }
12 public unsafe void first()
13 {
14 int i = 5;
15 Value v = new Value();
16 v.i = 25;
17
18 ///查看V實例的地址
19 fixed (int* pi = &(v.i))
20 {
21 Console.WriteLine("V.i Address 0x{0:X}", (int)pi);
22 }
23
24 second(v, i);
25
26 ///執行完second函數後V實例的地址
27 fixed (int* pi = &(v.i))
28 {
29 Console.WriteLine("V.i Address 0x{0:X}", (int)pi);
30 }
31
32 Console.WriteLine(v.i);
33 }
34 public unsafe void second(Value v, int i)
35 {
36 i = 0;
37