程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#學習筆記(基礎知識回顧)之值傳遞和引用傳遞,

C#學習筆記(基礎知識回顧)之值傳遞和引用傳遞,

編輯:C#入門知識

C#學習筆記(基礎知識回顧)之值傳遞和引用傳遞,


一:要了解值傳遞和引用傳遞,先要知道這兩種類型含義,可以參考上一篇

C#學習筆記(基礎知識回顧)之值類型和引用類型

二:給方法傳遞參數分為值傳遞和引用傳遞。

 2.1在變量通過引用傳遞給方法時,被調用的方法得到的就是這個變量,更准確的說,是指向內存中變量的指針。所以方法內部對變量進行的任何改變在方法退出後仍然有效。而如果變量通過值傳遞給方法,被調用的方法得到的是變量的一個相同副本,也就是說方法退出後,對變量進行的修改會丟失。

  2.2值類型的值傳遞:值類型的變量包含的是實際數據,作為參數傳遞的是數據本身的副本。如下,int類型通過值傳遞給方法,對應方法對該值所做的任何改變都沒有改變原先int對象的值。

   

  2.3通過引用傳遞值類型:傳遞的不是值類型的值,而是對值類型的引用,如下,參數i不是int類型,而是對num的引用,方法內部i加一時,實際是i所引用的項num。所以i加一也就修改了num的值。(個人理解是:AddOne(ref num)相當於傳遞了num的指針104524728,而AddOne方法中對i的操作,相當於操作指針所指向的值,即num的值)。

 

 

 

  2.4:通過值傳遞引用類型。引用類型的變量不直接包含其數據,他包含的是對數據的引用。通過值傳遞引用類型的參數時,會改變該引用所指向的數據值,但是無法改變引用本身的值。示例代碼如下:

  2.4.1:下面的示例演示通過值向 AddOne方法傳遞引用類型的參數 str。由於該參數是對 str的引用,所以AddOne方法內的操作會更改str的值。

 

 class Program
    {
        static void Main(string[] args)
        {
            StringBuilder str = new StringBuilder();
            str.Append("hello");
            AddOne(str);

            Console.WriteLine("num的值為:" + str);//輸出值為hello,word

            Console.ReadKey();
        }

        public static void AddOne(StringBuilder sb)
        {
            sb.Append(",world");
        }
    }

 

 

 

  2.4.2通過值傳遞引用類型時,試圖將參數重新分配到不同的內存位置時,該操作僅在方法內有效,並不影響原始變量。如下代碼:

 

class Program
    {
        static void Main(string[] args)
        {
            StringBuilder str = new StringBuilder();
            str.Append("hello");
            AddOne(str);


            Console.WriteLine("str的值為:" + str);//輸出值為hello

            Console.ReadKey();
        }

        public static void AddOne(StringBuilder sb)
        {
            sb = new StringBuilder();
            sb.Append(",world");
        }
    }
View Code

 

 

 

  2.5:通過引用傳遞引用類型。其實是傳遞其引用地址的引用,類似於指針的指針。引用傳遞引用類型如果創建一個新的實例會影響原來的引用類型。代碼如下

 

 class Program
    {
        static void Main(string[] args)
        {
            StringBuilder str = new StringBuilder();
            str.Append("hello");
            AddOne(ref str);


            Console.WriteLine("str的值為:" + str);//輸出值為,world

            Console.ReadKey();
        }

        public static void AddOne(ref StringBuilder sb)
        {
            sb = new StringBuilder();
            sb.Append(",world");
        }
    }
View Code

 

 

三:關於值類型和引用類型的轉換可看下一篇:

C#學習筆記(基礎知識回顧)之值類型與引用類型轉換(裝箱和拆箱)

 


 


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved