15. 值传递和引用传递
一、值传递和引用传递
1、什么是值传递?
答:值传递是指在调用函数时将实际参数(实参)复制一份传递到函数中,系统将为目标对象重新开辟一个完全相同的内存空间。这样在函数中如果对参数进行修改,将不会影响到实际参数。
2、什么是引用传递?
答:所谓引用传递是指在调用函数时将实际参数(实参)的地址传递到函数中,那么在函数中对参数所进行的修改,也会影响到实际参数。相当于使目标对象和原始对象对应同一个内存存储空间。
3、怎么用?
(1)值传递:
1 //类型1: 2 void Fun(int a) //a形参 3 { 4 a = 10; 5 } 6 static void Main(string[] args) 7 { 8 int b = 20; //b实参 9 Program f = new Program(); 10 //这里发生了值传递,结果等于20 11 f.Fun(b); 12 Console.WriteLine(b); 13 Console.ReadKey(); 14 }
1 //类型2: 2 void AddNumber(int num1) 3 { 4 num1 += 100; 5 } 6 static void Main(string[] args) 7 { 8 int b = 20; 9 Program f = new Program(); 10 //这里发生了值传递,结果等于20 11 f.AddNumber(b); 12 Console.WriteLine(b); 13 Console.ReadKey(); 14 }
(2)引用传递:
1 //类型1:ref关键字 2 void Fun(ref int a) 3 { 4 a = 10; 5 } 6 static void Main(string[] args) 7 { 8 int b = 20; 9 Program f = new Program(); 10 //这里发生了引用传递,结果等于10 11 f.Fun(ref b); 12 Console.WriteLine(b); 13 Console.ReadKey(); 14 }
1 //类型2: 2 void AddNumber(ref int num1) //num1形参 3 { 4 num1 += 100; 5 } 6 static void Main(string[] args) 7 { 8 int b = 20; //b实参 9 Program f = new Program(); 10 //这里发生了引用传递,结果等于120 11 f.AddNumber(ref b); 12 Console.WriteLine(b); 13 Console.ReadKey(); 14 }
二、总结
1、基本数据类型(int,float,double,char)都是值传递;
2、类的实例化对象与数组都是“引用传递”;
3、ref 关键字可以把基本数据类型的值传递,改为“引用传递”;
4、out 关键字是“输出参数”关键字。
例:
1、实例化对象:(引用传递)
1 //实参 2 public string _strName = "张三"; 3 public int _intHeight = 180; 4 void AddNumber(Program per) //形参 5 { 6 per._strName = "李四"; 7 per._intHeight = 200; 8 } 9 static void Main(string[] args) 10 { 11 Program perObj = new Program(); 12 perObj.AddNumber(perObj); 13 //结果输出为“200、李四”,说明实参改变了。所以为引用类型 14 Console.WriteLine(perObj._intHeight); 15 Console.WriteLine(perObj._strName); 16 Console.ReadKey(); 17 }
2、out关键字
1 //利用 out 关键字实现多个返回值 2 public void ComputerNumber(int intNum1,int intNum2,out int intAddResult,out int intSubResult) 3 { 4 intAddResult = intNum1 + intNum2; 5 intSubResult = intNum1 - intNum2; 6 } 7 static void Main(string[] args) 8 { 9 Program Obj = new Program(); //实例化 10 int intAddResult1 = 0; 11 int intSubResult1 = 0; 12 Obj.ComputerNumber(10, 20, out intAddResult1, out intSubResult1); 13 //输出结果为30和-10 14 Console.WriteLine(intAddResult1); 15 Console.WriteLine(intSubResult1); 16 Console.ReadKey(); 17 }