前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用out、ref和parms?

如何使用out、ref和parms?

作者头像
高一峰
发布2020-09-22 10:32:31
9320
发布2020-09-22 10:32:31
举报
文章被收录于专栏:高渡号外
热门关键词

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!这样是不被允许的。

那,真的可能遇到这种情况吗?遇到了该怎么办?

这个问题就交给读者去思考吧。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 高渡号外 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档