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