博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ref out 方法参数
阅读量:7234 次
发布时间:2019-06-29

本文共 1860 字,大约阅读时间需要 6 分钟。

ref out 相似

ref和out两个关键字的作用大致相同,但是有一些微妙但是重要的区别。

两者的行为相似到连编译器都认为这两者不能被重载:

public void SampleMethod(out int i) { }
public void SampleMethod(ref int i) { }
以上重载在编译时将被抛出一个错误,编译器认为out和ref是同样的行为,但是事实上在行为上他们有区别。

共同点

两者的值在调用函数中被修改后都会影响到原始值。

区别

ref一定要初始化,out不需要

因为out在调用方法使用之前会把参数值清空不管原本是什么值,所以out不需要初始化

 

ref是可能被修改,out是强制调用方法一定要修改其值。

但是上面那句话表明了什么?解读一下,便是ref传入的值在函数体中可能被修改,而out传入的值在函数体中是强制的一定要被赋值。

用在哪儿

方法无须有返回值,便可以获取想要的结果[例如:修改参数的值]

这些情况用赏心悦目

1、当我们频繁传递大型参数的时候,比如说DataTable、DataSet...的时候,会节省好多内存资源。

2、当我们想得到方法多样化的处理结果的时候,而我们又不愿意复杂化方法所返回的结果,那么我们可以在方法里定义多个ref 或者 out,以期得到丰富的结果。

比如说,我们调用一个方法,要同时得到string、int、double、bool、Array...等几种不同类型的结果,而return返回object又很复杂的时候,

ref 和out的处理效果,看上去将会是多么的赏心悦目...

ref 是有进有出,而out是只出不进

或者换句话说:ref 是有进有出,而out是只出不进 ref 关键字使用参数按引用传递,而不是值,通过引用传递的效果是在调用方法中对参数的任何修改都会反映在在该变量中。引用参数的值与基础参数变量的值始终是一样的。
1.属性不是变量,因此不能作为 ref 参数传递
2.尽管ref 和 out 在运行时的处理方式不同,但它们在编译时的处理方式是相同的。因此,如果一个方法采用 ref参数,而另一个方法采用out参数,则无法重载这两个方法。
如果尝试这么做,将导致不能编译该代码。
3.如果一个方法采用 ref 或out参数,而另一个方法不采用这两类参数,则可以进行重载。

示例程序

public class MyApp{     public static void UseRef(ref int i){         i+=100;         Console.WriteLine("i={0}",i);     }    static void Main(){        int i=10;        Console.WriteLine("before : i={0}",i);        UseRef(ref i);        Console.WriteLine("after : i={0}",i);    }}/* before : i=10;    i=110; * after : i=110; */ //out关键字会导致参数通过引用来传递,这引ref关键字类似,但你必须在调用方法里对 参数进行重新赋值,否则编译不通过 与ref的不同之处:     1.ref要求变量必须在传递之前进行初始化     2.尽管作为out参数传递的变量不需要在传递之前进行初始化,但需要调用方法以便在方法返回之前赋值public class MyApp{     public static void UseOut(out int i){         i+=100;         Console.WriteLine("i={0}",i);     }    static void Main(){        int i;//out 这里可以不初始化        Console.WriteLine("before : i={0}",i);        UseOut(out i);        Console.WriteLine("after : i={0}",i);    }}/* before : i=0;    i=100; * after : i=100; */

转载于:https://www.cnblogs.com/zhaoqingqing/p/3712635.html

你可能感兴趣的文章
列表嵌套元祖排序
查看>>
jquery自动切换tabs选项卡的具体实现
查看>>
使用MDaemon作垃圾邮件过滤网关攻略
查看>>
python脚本判断一个数是否为素数的几种方法
查看>>
Java学习笔记(39)——Java集合11之Stack
查看>>
office 2010打开word文件提示以安全模式打开
查看>>
Microsoft virtual WiFi Miniport Adapter
查看>>
linux /dev/null 对ssh登录的影响
查看>>
连上***后 自己的电脑用公司网络
查看>>
Windows7部署Android开发环境实战图
查看>>
IBM-P55A 内存故障处理
查看>>
JVM工作原理和特点
查看>>
hosts文件生效
查看>>
Decrypt file with GPG and Download m3u8 file
查看>>
产品经理的职业发展路线是什么
查看>>
形参长度可变的方法
查看>>
scp: command not found找不到scp命令
查看>>
协议森林01 邮差与邮局 (网络协议概观)
查看>>
linux shell 字符串操作(长度,查找,替换)详解
查看>>
借助开源工具高效完成Java应用的运行分析
查看>>