Java编程、C#/.NET编程、Python编程
Web前端、SQL数据库
新手编程1001问(8)
如何使用out、ref和parms?
【摘要】C#中有三个高级参数,分别是out,ref,params, 你会用吗?
1、out参数
通常情况下,我们写一个方法只能返回一个值。但是,有时候我们也会遇到,除了需要获得正常的返回值的同时,还希望能够获得参与方法运算的其他的值,那怎么办呢?
这时,我们应该想到使用out参数了,它可以帮助我们返回超过一个以上的返回值。
如下案例,是一个简单的登录验证代码,我们除了需要验证用户名和密码是否正确(布尔类型)以外,还希望同时获得相应的被提前定义好的提示信息(字符串类型)。
这个“被提前定义好的提示信息”将是一个“额外的”字符串型的值需要被返回。
请注意:
(1)、如果希望方法返回多个参数,则添加多个参数即可。例如:login(string name, string pwd, out string msg,out int num)。
(2)、out的参数必须在方法中进行初始化。
当然,这个案例,如果用ref也是可以解决的。下面,我们来看看ref参数。
2、ref参数
同样地,当我们希望一个方法能够返回多个值时,也可以考虑使用ref参数。但是,使用ref参数时,需要在初始化这个参数时,赋一个初始值。
于是,这个被赋值的参数,在参与方法的“运算”以后,将自动(隐式地)返回它运算后的结果。
上例中,使用void修饰符的无返回值方法,实际上隐式地返回了n1和n2两个参数的值。
请不要觉得这个案例太简单,想想你自己遇到的Project吧, 特别是在原本已经够复杂的代码块中,如果发现还差一个额外的“值”没有拿到的时候,是不是又要开始“头大”呢?
在没有发现out和ref的时候,我们总是临时创建一个字符串或者字符串数组,用来“拼接”你想要的多个返回值。顾不上性能损耗且不说,就算拿到了这个临时拼接的字符串,还得“解拼”以后才能使用,如此苦力的干活,想想是不是有点傻?
好吧,自从有了out和ref,这样的“傻事”早就不干了。
3、params参数
通常情况下,我们定义一个方法,参数的个数总是确定的,如果硬是有几个不同的参数会影响到不同的算法,那么,使用方法重载肯定是没有问题的。
但是,世事无常啊!没有你遇不到的,只有你想不到的。偏偏有时候,我们无法确定到底会有几个参数需要传递,可怜的参数,特别是形参,此时该如何定义呢?
还是应了那句老话,办法总比困难多。伟大的C#又提供了一个重要的参数params!
对的!在不确定传参的个数时,可以使用params传参。
实际上,params是一个支持不同类型的一维数据对象的列表,其长度是可变的。
请看下面的实例:
上例中,如果我们硬是要提前定义一个int[]或者object[],那么,似乎不使用params也是可以的。但是,我们不是说程序员大多都是有点强迫症的吗?
最后,小结一下:
首先,out和ref,两者都是按地址传递的,使用后都将改变原来参数的值。
其次,ref可以把参数的数值传递进方法或函数,但是out会把参数清空,或者只需要初始化一个参数名,就是说你无法把一个数值通过out传递进去。所以,out参数进去后,参数的值都为空。这就是两者的区别!
简单、形象的理解就是,ref是有进有出,out是只出不进。
而一旦我们遇到参数个数无法确定的时候,我们就会想到使用params来定义我们的参数,简单又方便。
但是,我们会不会遇到这样的情况呢:不仅参数的个数无法确定,而且,还需要返回多个值,这时该怎么办?
答案似乎很简单,将params与out或者ref参数组合使用!
NO,NO!这样是不被允许的。
那,真的可能遇到这种情况吗?遇到了该怎么办?
这个问题就交给读者去思考吧。