程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 引用類型與ref傳遞實例精解

引用類型與ref傳遞實例精解

編輯:C#入門知識

一直以來對於在引用類型前加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
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved