out关键字会导致参数通过引用来传递,通俗点说,就是往外传值的。
out参数的作用:用于以内部变量为外部变量赋值的,out一般适用于某个方法不只是使用return返回单个值,而是需要有多个返回值的情况。
out参数的使用需要注意以下几点:
1)out参数传递的变量在传递之前不需要对其进行初始化。
分析:在调用方法之前,对out参数传递的变量只需声明,可以赋值也可以不赋值,不过反正都是要在调用时被覆盖掉,所以大可不必赋值,因为赋值了虽然不会报错,但却根本也没有用处,没必要多此一举!(详见以下代码)
2)如果方法的参数有使用out关键字修饰时,在调用该方法时,记住也要在out参数传递的变量前面加上out才行。
分析:加上out能表明这个参数不是传入的,而是传出值的,但是out修饰的参数依然可以传入值;不加out关键字,会使得该 参数成为无效参数而报错。
3)方法使用了out参数传递变量时,就是要返回值,所以必须在方法返回值或方法结束之前,对out所修饰的变量进行赋值。
1 static void Main(string[] args) 2 { 3 int rst; //out修饰的变量在调用之前只需声明即可 4 int num=8; 5 if (isMod(num, out rst)) //记住加上out修饰变量 6 { 7 Console.WriteLine("{0}是偶数,{0}/2={1}", num, rst); 8 } 9 else 10 { 11 Console.WriteLine("{0}不是偶数",num); 12 } 13 Console.ReadKey(); 14 } 15 16 public static bool isMod(int number,out int result)//通过参数返回值 17 { 18 if (number % 2 == 0) 19 { 20 result = number / 2; //方法结束之前必须对result赋值 21 return true; 22 } 23 else 24 { 25 result = 0; //方法结束之前必须对result赋值 26 return false; 27 } 28 }
在上述代码中,out 修饰了rst 和result 两个变量,就相当于在它们之间建立了一种联系,对result 进行赋值也就是对rst进行赋值,等于把方法中的局部变量的值返出去了,成功达到了通过参数返值的目的。
4)另外,若是要在方法内部使用out 修饰的变量,如上述程序,在isMod 方法中使用result 之前,必须先对其进行赋值才能使 用。虽然可能在isMod 方法被调用之前,已经对rst 赋值,比如 rst=2,当参数rst 以out 形式传入时,result 虽然也能收到rst 传来的值,即调用时result 也等于2,然而,在isMod 方法里想要使用result 变量时,还是必须先要对它赋一次值,这就显得调用之前的赋值变得毫无意义。
ref 关键字,同out一样,可以使得参数通过引用来传递。换句话说,ref能够让你直接对原来那个数进行操作,而不是将原数复制一份,对那个复制项进行操作。
ref参数的作用:与out不同的是,它可以双向传值,主要适用于场景内部对外部的值进行改变的情况。
ref参数的使用需要注意以下几点:
1)ref参数传递的变量在传递之前一定要对其进行初始化赋值。
分析:ref本来就适用于场景内部对外部的值进行改变的情况,所以在传参之前,一定要对其赋初值,才能有值传过去。
2)如果方法的参数有使用ref关键字修饰时,在调用该方法时,记住也要在ref参数传递的变量前面加上ref才行。
分析:加上ref能表明这个参数既是传入的,又可以是传出值的,不加ref关键字,会使得该参数成为无效参数而报错,num和number两个变量都使用了ref来修饰,使得number指向了num,所以在Test方法中对number进行操作时,就是对num进行操作。(详见以下代码)
1 static void Main(string[] args) 2 { 3 int num = 100; //ref修饰的变量,必须对其赋初值 4 Test(ref num); //记住加上ref变量 5 Console.WriteLine(num); 6 Console.ReadKey(); 7 } 8 9 public static void Test(ref int number) 10 { 11 int numA = number; 12 number = 2; //不一定要赋值 13 }
3)方法使用了ref参数传递变量时,不同于out,没有要求一定在方法返回值或方法结束之前,对ref所修饰的变量进行赋值,所以可以不赋值。
4)另外,若是要在方法内部使用ref修饰的变量,如上述程序,在Test方法中使用number之前,因为要求已经对即将传入的num,赋了初值100,不同于out,此时可以在Test方法内直接使用number变量,并且,当参数num以ref形式传入时,number就能收到num传来的值,即调用时number也等于100,之后改变number的值,也同时改变了num的值。
params 是关键字,可以使得在参数个数可变处采用参数的数组型参数,比如 int sum(params int[] values)。
可变参数的作用:使得个数不确定的可变参数以数组的形式传递,适合于方法的参数个数未知的情况时,用于传递大量的数组集合参数。
可变参数在使用时需注意:
1)不允许将params修饰符与ref和out修饰符组合起来使用。
2)当方法的参数列表中有多个参数时,params修饰的参数必须放在最后,不能放在前面,以免程序不好确定参数究竟有多少个而报错。比如: int sum(string name,params int[] values)
3) 一个方法当然可以包含可变参数和不变参数,两个可以同时使用。
这样,有了可变参数,就可以在某些情况下根据特定的需要来确定方法的参数个数。
这是我的第一篇学习日记,知识点可能讲的不是很细,但其中的每一点都是我自己归纳出来的,以前只学过点C++基 础,没接触过C#,更不知道有Out参数、Ref参数和可变参数这三个概念,通过学习黑马基础入门视频的C#编程基础部分,以及查阅相关资料,对这三个知识点已经能够基本掌握,还记得当初跳着看视频,不能理解调用int.TryParse方法时,为什么要在参数前加上out,out又有什么作用,现在已经能清楚地运用它们了。即使这是些很简单的内容,但是却是很重要的基础,我需要把它记录下来,以便于提醒自己。现在发现,写学习笔记不仅可以提高自己的表达能力,还有助于学习。
我告诉自己,需要坚持下去!
详细请查看:www.itheima.com
黑马程序员_浅谈out参数、ref参数和可变参数,布布扣,bubuko.com
原文:http://www.cnblogs.com/FloraWoo/p/3840478.html