函數參數的值傳遞和引用傳遞筆記
首先C# 是完全面對對象的高級語言 。 主要有2種基礎數據類型且都繼承於Object,都在C++的基礎上做了封裝,都有着類似C++類對象
的感覺。這2種基礎數據類型的互相轉換會造成裝箱和拆箱操作(這里就不做過多說明了)。
值類型包含:數值類型(int float 等),bool , 枚舉, 結構體 ,可空類型等;
引用類型包含:數組 (Array),Class ,接口 ,object ,字符串等;
一:值傳遞做參數傳遞進入函數
會在函數體類創造一個新的拷貝來進行操作,不影響原有數據類型中的值。
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 public class Test_Script : MonoBehaviour 6 { 7 public int num = 10; 8 9 public void Start () 10 { 11 Add(num); 12 num--; 13 Debug.Log("num :" +num); 14 } 15 16 public void Add(int _num) 17 { 18 _num++; 19 Debug.Log("_num :" +_num); 20 } 21 22 }
運行效果。
二:引用傳遞做參數傳遞進入函數
只是復制這個對象本身,即復制其地址值,而不是它指代的對象。
(注意修改指向地址的值原本的值也會改變,所以引用傳遞其實是引用類型的地址不同,指向的地址相同【跟C++中的指針概念很像】)。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace CSharp_Script 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 int[] intArray = new int[] { 123, 123, 123, 123, 123 }; 14 string str = "hello,world" ; 15 16 17 Set(intArray, str); 18 19 //輸出原來的值 20 for (int i = 0; i < intArray.Length; ++i) 21 { 22 Console.WriteLine("intArray[" + i.ToString() + "] :" + intArray[i].ToString()); 23 } 24 25 Console.WriteLine("str" + str); 26 27 Console.ReadKey(); 28 } 29 30 //設置改變原來的值 31 public static void Set(int[] _intArray, string _str) 32 { 33 for (int i = 0; i < _intArray.Length; ++i) 34 { 35 _intArray[i]++; 36 Console.WriteLine("_intArray[" + i.ToString() + "] :" + _intArray[i].ToString()); 37 } 38 39 _str = "world,hello"; 40 41 Console.WriteLine("_str" + _str); 42 } 43 } 44 }
輸出:

二者的區別:
值傳遞時,系統首先為被調用方法的形參分配內存空間,並將實參的值按位置一一對應地復制給形參,此后,被調用方法中形參值得任何改變都不會影響到相應的實 參;
引用傳遞時,系統不是將實參本身的值復制后傳遞給形參,而是將其引用值(即地址值)傳遞給形參,因此,形參所引用的該地址上的變量與傳遞的實參相同,方 法體內相應形參值得任何改變都將影響到作為引用傳遞的實參。
