当前位置: 代码迷 >> C# >> 初学者笔记——ref和out参数(参数传递)
  详细解决方案

初学者笔记——ref和out参数(参数传递)

热度:90   发布时间:2016-05-05 04:28:23.0
菜鸟笔记——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修饰,那么将会传递栈空间的地址,不再是栈空间的内容
           传递过程:形参是实参的一种规范,形参也是一个独立的变量,将会把实参赋该形参     
    
        

 

  相关解决方案