黑马程序员--out和ref的理解和应用

谈起out和ref,就不得不谈起上篇博客对方法的介绍和认识。使用方法时,一般是通过传入参数来把值传入方法进行运算和使用,但是如果我们偶尔要传出多个值或者既要传入又要传出该怎么办呢?

有人可能想到了利用全局变量等等方法,虽然可行,但是对于简便性和严谨性而言,都只适用于小范围,如果需要传出多个值或者方法体很复杂的时候,这些方法未免显得稍稍不适宜,所以微软给我们准备了out和ref为我们更加便捷的解决方法传出值的问题,out和ref虽然能做的事情类似,但是也有不同,我们来分开介绍一下。

先说一下out关键字,当我们想要一次返回多个参数的时候,使用out关键字很重要,out可以使参数通过引用来传递,例如,我们要输入一个数组,要求写一个方法来传出数组每个元素的和,最大值,最小值等,就要用到out关键字来实现,代码如下:

 1 namespace out和ref
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             int num, max, min;//定义需要用到的变量
 8             int[] number={1,2,3,4,5};//定义数组
 9             num = ss(number, out max, out min);//把数组number传给方法ss并传出max和min
10             Console.WriteLine("和是{0},最大值是{1},最小值是{2}",num,max,min);//输出num,max,min
11             Console.ReadKey();
12             
13         }
14         public static int ss(int[] number, out int max, out int min)//定义方法ss,传入数组ss,利用out传出最大值和最小值
15         {
16             int num = 0;//定义变量num,用于存储和
17             max = number[0];//给最大值赋初值
18             min = number[0];//给最大值赋初值
19             for (int a = 0; a < number.Length; a++)
20             {
21 
22                 num += number[a];//循环取得和
23                 if (number[a] >max)
24                 {
25                     max = number[a];//循环取得最大值
26                 }
27                 if (number[a] < min)
28                 {
29                     min = number[a];//循环取得最小值
30                 }
31             }
32             return num;//返回num
33         }
34     }
35 }

在我们使用out关键字时,需要注意的一点是,必须给要传出的变量赋初值。不然会报错

错误 2 控制离开当前方法之前必须对 out 参数“max”赋值 c:\users\liuyang\documents\visual studio 2010\Projects\out和ref\out和ref\Program.cs 37 13 out和ref

报错内容为离开当前方法前必须对传出的参数赋值,也就是不能传出空值。

还值得注意的一点是,当我们在方法中传出值时,比如

 public static int ss(int[] number, out int max, out int min)//定义方法ss,传入数组ss,利用out传出最大值和最小值

定义方法时我们传出了max和min,当接收时,我们也要用相同的out关键字来接收,比如

 int num, max, min;//定义需要用到的变量
            int[] number={1,2,3,4,5};//定义数组
            num = ss(number, out max, out min);//把数组number传给方法ss并传出max和min

这里用到的max和min并不是方法里的,而是我们定义用来接收方法所传出的值的,很容易可以看出,接收传出值的时候,也要在接收传出的变量前加上out关键字。

下面我们来简要介绍下ref关键字,ref关键字的语法和用法和out关键字非常类似,但是需要注意的是,ref需要初始化才能使用,因为ref类似于快捷方式,指向的是变量所在的内存

改变ref关键字后变量的值,就相当于直接改变方法外变量的值,因为都是指向同一内存,这点和c语言里的指针非常类似,ref关键字即可用传入参数,也可以用于参数的传出,可谓是非常方便。

例如,

class Program
    {
        static void Main(string[] args)
        {
            int b = 100;//定义b
            int c = a(ref b);//定义变量c来接收方法a传出的值
            Console.WriteLine(b);//输出c
            Console.WriteLine(c);//输出b
            Console.ReadKey();
        }
           
        public static int a(ref int b)//定义方法a并用ref关键字传出b
        {
            b += 100;//b=b+100
            return b;//返回b
            
        }
    }

正常情况下,方法内返回的值不会影响到方法外的变量的值,通过上面的代码,我们可以发现,b和c的值一同被改变了,也就是说 ref关键字指向的是变量b所在的内存空间,在方法中改变变量b的值,就是直接改变方法外b的值。

关于ref和out关键字的介绍就到这里,如有不妥之处,还恳请大家帮忙指出。

黑马程序员,梦想起航的地方。

posted on 2013-01-20 00:14  刘洋.neusoft  阅读(222)  评论(0编辑  收藏  举报