1.引入问题
实例:写一个方法,计算int数组中的每个元素的总和以及最大值与最小值
* 其目的是返回3个值类型的变量, 那么问题来了,但是方法return只能返回一个值 ,这时就可以用ref和out来修饰参数
示例代码(没有修饰):
class="code_img_closed" src="/Upload/Images/2015032421/0015B68B3C38AA5B.gif" alt="" />logs_code_hide('6acb094f-a5c6-425c-8e2e-fcb0b1291c58',event)" src="/Upload/Images/2015032421/2B1B950FA3DF188F.gif" alt="" />1 static void Main(string[] args) 2 { 3 4 5 int[] arr = { 56,31,2,89,76}; 6 int sum = 0, max = 0, min = 0; 7 GetValue(arr, sum, max, min); 8 9 Console.WriteLine("总和:" + sum + ",最大值:" + max + ",最小值:" + min); 10 } 11 12 public static void GetValue(int [] arr , int sum, int max, int min) 13 { 14 sum = 0; 15 max = arr[0]; 16 min = arr[0]; 17 18 for(int i = 0; i < arr.Length; i++) 19 { 20 sum += arr[i]; 21 if(max<arr[i]) 22 { 23 max = arr[i]; 24 } 25 if(min>arr[i]) 26 { 27 min = arr[i]; 28 } 29 30 } 31 32 }View Code
示例代码(修饰后):
1 static void Main(string[] args) 2 { 3 4 5 int[] arr = { 56,31,2,89,76}; 6 int sum = 0, max = 0, min = 0; 7 GetValue(arr,ref sum, ref max, ref min); 8 9 Console.WriteLine("总和:" + sum + ",最大值:" + max + ",最小值:" + min); 10 } 11 12 public static void GetValue(int [] arr , ref int sum, ref int max, ref int min) 13 { 14 sum = 0; 15 max = arr[0]; 16 min = arr[0]; 17 18 for(int i = 0; i < arr.Length; i++) 19 { 20 sum += arr[i]; 21 if(max<arr[i]) 22 { 23 max = arr[i]; 24 } 25 if(min>arr[i]) 26 { 27 min = arr[i]; 28 } 29 30 } 31 32 }View Code
结果证实: 没有用ref和out传递的值类型参数,将传递的是栈内存里的值内容
* 用ref和out修饰后,值类型传递将传递栈内存的地址,也就导致了形参和实参(实参给形参赋值),只向一个地址,
* 形参通过方法改变后,实参变量的值页将会改变
2.ref=references---引用
* 注意:1.传参的参数必须在方法调用之前前声明并赋值(先赋值在使用)
2.传参实参要加ref,方法声明的形参也要加ref,“门当户对”。
3.ref传递的参数其实没有真正的创建一个新的变量,是将实参和形参共享一个地址的内存
3.out=输出参数
* 注意:1.传参的参数可以只声明不赋值,但是在调用的方法体内,必须为其赋值(在方法体内必须赋值)
2.传参实参要加out,方法声明的形参也要加out,“门当户对”。
3.out传递的参数其实没有真正的创建一个新的变量,是将实参和形参共享一个地址的内存
4.ref和out的区别:
ref传递的参数必须赋值在使用(在外赋值)
out可以只声明不赋值,但是在方法体内必须赋值(在内赋值)
5.基础概念:
1.参数传递,默认都是传递栈空间的内容
2.如果添加了ref或out修饰,那么将会传递栈空间的地址,不再是栈空间的内容
传递过程:形参是实参的一种规范,形参也是一个独立的变量,将会把实参赋该形参