
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; using System.IO; using System.Net.Sockets; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Test a = new Test(); a.Message = "初始值"; Test001(a); Console.WriteLine("沒有添加ref關鍵字,也沒有對引用參數引用了新的一個Test類型的對象,結果為:{0}", a.Message); Test b = new Test(); b.Message = "初始值"; TestRef(b); Console.WriteLine("沒有添加ref關鍵字,並重新對引用參數引用了新的一個Test類型的對象,結果為:{0}", b.Message); Test c = new Test(); c.Message = "初始值"; TestRef(ref c); Console.WriteLine("關鍵字ref關鍵字,並重新對引用參數引用了新的一個Test類型的對象,結果為:{0}", c.Message); Console.Read(); } static void TestRef(Test t) { t = new Test(); t.Message = "對象已賦值"; } static void TestRef(ref Test t) { t = new Test(); t.Message = "對象已賦值"; } static void Test001(Test t) { t.Message = "對象已賦值"; } } public class Test { private string _message; public string Message { get { return _message; } set { _message = value; } } } }
其實很簡單,C#中方法中的參數也是一個變量,這個變量也需要有一個地址。
對於引用類型的方法參數,傳入的對象如果不加Ref,方法參數也就是這個變量也將被創建,不過因為是引用類型,所以地址直接指向所傳入對象的地址。所以實際上是有兩個變量,但都指向了同一處地址。
如果加了Ref,那么方法參數這個變量,將不被創建,也就是只有一個變量,指向了一處地址。
引用類型加不加Ref沒有本質區別,只是多個了變量而已。