閱讀893 返回首頁    go 阿裏雲 go 技術社區[雲棲]


C# 方法參數 ref 詳述

其實這個問題很容易理解,首先在C#中傳遞方法參數缺省是“值拷貝”模式,也就是說對於值類型(ValueType)變量直接拷貝一份,而對於引用類型則拷貝一個指向同一對象的引用副本傳遞給方法,因此即使不使用ref關鍵字,我們也可以在方法內部改變該引用所指向對象的內部狀態,但是某些時候我們需要在方法內部創建一個新的對象實例,並使得原有引用指向這個新的對象。那麼問題就來了,由於現在存在兩個引用,我們改變的隻是傳遞到方法的引用副本,而該副本在超出方法作用域後既失去作用,而原有的引用依然指向原有對象。因此我們需要使用ref關鍵字,那麼傳遞給方法的不再是引用副本,而是引用本身。我們就可以改變原有引用對象實例了。

  public class Data
  {
    public int i = 10;
  }

  public class Class1
  {
    public static void Test1(Data d)
    {
      // 參數d隻是一個引用副本,和原引用變量d同時指向同一個對象,因此都可以修改該對象的狀態。
      d.i = 100;
    }

    public static void Test2(Data d)
    {
      // 創建新的Data對象,並將參數d指向它。此時參數d和原有引用d分別指向2個不同的Data對象,因此
      // 當超出Test方法作用範圍時,參數d和其引用的對象將失去引用,等待GC回收。
      d = new Data();
      d.i = 200;
    }

    public static void Test3(ref Data d)
    {
      // 由於使用ref關鍵字,因此此處的參數d和原變量d為同一引用,並沒有創建副本,所以創建新的Data
      // 對象是可行的。
      d = new Data();
      d.i = 300;
    }

    public static void Main(string[] args)
    {
      Data d = new Data();
      Console.WriteLine(d.i); // 10

      Test1(d);
      Console.WriteLine(d.i); // 100

      Test2(d);
      Console.WriteLine(d.i); // 100

      Test3(ref d);
      Console.WriteLine(d.i); // 300
    }
  }
 

最後更新:2017-04-02 00:06:27

  上一篇:go [.NET 基於角色安全性驗證] 之二:ASP.NET Forms 身份驗證流程分析
  下一篇:go 中文分詞組件