函数参数的值传递和引用传递笔记
首先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 }
输出:
二者的区别:
值传递时,系统首先为被调用方法的形参分配内存空间,并将实参的值按位置一一对应地复制给形参,此后,被调用方法中形参值得任何改变都不会影响到相应的实 参;
引用传递时,系统不是将实参本身的值复制后传递给形参,而是将其引用值(即地址值)传递给形参,因此,形参所引用的该地址上的变量与传递的实参相同,方 法体内相应形参值得任何改变都将影响到作为引用传递的实参。