C# 中的三個高級參數 ref


今天在瀏覽博文時,看到這篇文章:C#中的ref 傳進出的到底是什么 ? 在傳對象時使用ref的疑問

 

引用類型就傳的就是地址,值類型傳的就是值,可是還仍有那么多人迷惑,網上雖然流傳着很多ref 的相關文章,似乎都沒為大伙解下惑。

最近有人在看我 CYQ.Data 框架 的時候說起,既然class是引用地址,本身傳的就是地址,你代碼中還要寫ref傳遞來干什么;

 

貼出來做示例:

復制代碼
  /// <summary>
    /// by 路過秋天 http://cyq1162.cnblogs.com
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
           Person p = new Person("張三");
           Change(p);
           Write(p.Name); //輸出的是張三 並不是李四

           Change(p, "李四");  
           Write(p.Name);//輸出的是李四

          Change(ref p);
          Write(p.Name); //輸出的是王五 
          Console.ReadKey();
    }   
        static void Change(Person p)
        {
           p = new Person("李四");
        }
        static void Change(Person p, string name)
        {
            p.Name = name;
        }
        static void Change(ref Person p)
        {
            p = new Person("王五");
        }
    }
復制代碼

 

這里順便截圖讓大伙看看是怎么調試而解惑的。

F5運行:

1:我們運行到第一行代碼,斷點:

重點說明: p地址:0x044becf8

 

 

2:我們運行到Change(p)內部中

 

重點說明:p地址發生變化:0x044becd0
簡單說:你這內部的p和外面的p都不一樣,所以不會影響外面p的地址。
備注p值的地址變化了,是因為斷點在第一行代碼時還沒執行實例化,所以其值是一樣的。

 

於是第一行結果輸出:張三

 

3:接下來運行到Change(p,"李四") 函數內部

 

重點說明:這里內部的p的地址還是發生了變化,變成了0x044becd0
然而其指向的值是一樣的,所以你把值改了,所以“李四”就出來了。
備注: 內部的p和外面的p雖然不一樣,但是指向的值是一樣的

 

於是第一行結果輸出:李四

4:最后是 Change(ref p) 函數內部

 

重點說明: 這里內部的p地址和外部的p地址是一樣的,沒有發生變化
然后重新指向一個新的對象,只是對象的值地址發生了變化。
備注:外部p地址=內部p地址,所以其指向的值都是新的對象的值。

 

於是第三行結果輸出:張三

 

最終結果圖如下:

 

最后結言:

 

對於Class類型使用 ref,是為了保持引用的地址是一致的。
所以,不要僅僅意識到引用類型傳地址,值類型傳值就了事了,要切切的注意到,引用類型傳址時,內部傳參會產生一個新地址。
所以我們在傳遞類引用時,喜歡在內部使用 new的民工們得注意注意了。
這里似乎也是傳參領域的問題,只是附上了 ref 。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM