你的位置:首页 > ASP.net教程

[ASP.net教程]菜鸟笔记——ref和out参数(参数传递)


1.引入问题

实例:写一个方法,计算int数组中的每个元素的总和以及最大值与最小值
    * 其目的是返回3个值类型的变量, 那么问题来了,但是方法return只能返回一个值 ,这时就可以用ref和out来修饰参数

示例代码(没有修饰):

 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修饰,那么将会传递栈空间的地址,不再是栈空间的内容
           传递过程:形参是实参的一种规范,形参也是一个独立的变量,将会把实参赋该形参