ref out 方法参数
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;
*/
ref out 方法参数的更多相关文章
- Params 方法参数
params,ref,out 方法参数 示例 在下面的方法使用中 OpenWindow(params object[] args) 传递的参数args添加了params修饰 public void O ...
- 利用反射调用方法时,处理ref,out参数需要注意的问题(转)
转自:http://www.68idc.cn/help/buildlang/ask/20150318283817.html 项目中如下的泛型方法,因为要在运行时,动态指定类型参数,所以要利用反射来实现 ...
- C# 参考之方法参数关键字:params、ref及out
如果在为方法声明参数时未使用 ref 或 out,则该参数可以具有关联的值.可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值.通过使用方法参数关键字,可以更改这种行为. params ...
- c# 方法参数(传值,传引用,ref,out,params,可选参数,命名参数)
一.方法参数的类型----值类型和引用类型 当方法传递的参数是值类型时,变量的栈数据会完整地复制到目标参数中即实参和形参中的数据相同但存放在内存的不同位置.所以,在目标方法中对形参所做的更改不会 ...
- 工作中的趣事:聊聊ref/out和方法参数的传递机制
0x00 前言 我在之前的游戏公司工作的时候,常常是作为一只埋头实现业务逻辑的码农.在工作之中不常有同事会对关于编程的话题进行交流,而工作之余也没有专门的时间进行技术分享.所以对我而言上家虽然是一家游 ...
- C# 方法参数 out、ref、param 详解
ref和out都对函数参数采用引用传递形式——不管是值类型参数还是引用类型参数,并且定义函数和调用函数时都必须显示生命该参数为 ref/out形式.两者都可以使函数传回多个结果. ref 类似于 PH ...
- 【.net 深呼吸】细说CodeDom(6):方法参数
本文老周就给大伙伴们介绍一下方法参数代码的生成. 在开始之前,先补充一下上一篇烂文的内容.在上一篇文章中,老周检讨了 MemberAttributes 枚举的用法,老周此前误以为该枚举不能进行按位操作 ...
- [C#]浅析ref、out参数
转载:http://www.cnblogs.com/vd630/p/4601919.html#top 按引用传递的参数算是C#与很多其他语言相比的一大特色,想要深入理解这一概念应该说不是一件容易的事, ...
- Ref和Out参数的区别(转帖)
首先,如果不使用这两个关键字,那是什么样 呢? 看下面的例子: using System; class Test { static void Swap(ref int x, ref int ...
随机推荐
- 探索HashMap实现原理及其在jdk8数据结构的改进
因为网上已经太多的关于HashMap的相关文章了,为了避免大量重复,又由于网上关于java8的HashMap的相关文章比较少,至少我没有找到比较详细的.所以才有了本文. 本文主要的内容: 1.Hash ...
- winform(MDI窗体容器、权限设置)
一.MDI窗体容器: 1.功能: 它可以让其它窗体在它的内部打开,无法超出它的范围 将某个窗体的属性:IsMdiContainer设置为true - 窗口样式 2.问题: (1)如何将其它窗体在它的内 ...
- 学习总结——DOM
DOM(Document Object Model),即文档对象模型.DOM是针对HTML和XML文档的一个API,它描绘了一个层次化的节点树,允许开发人员添加.移除和修改页面的某一部分.在定义方面, ...
- Failed to upgrade AX 2012 R3 Retail channel database from CU9 to CU11 if SQL Server version was lower than 2012
I tried to upgrade AX 2012 R3 Retail channel database from CU9 to CU11 for client. after generated n ...
- JAVA- File类
File类是IO包中唯一代表磁盘文件本身的对象.File类定义了一些与一台无关的方法来操作文件,可以通过调用File类中的方法,实现创建.修改.删除文件等功能.File类的对象主要用来获取文件本身的一 ...
- JDBC demo
package com.zhangbz.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql ...
- 快捷下载 sourceForge下的资源
一些开源项目通常会放在 sourceforge.net下面发布.然而,这个网站有时候出现卡顿,并且需要点击几次页面才能下载到自己想要的资源. 这里有个好办法,一步列出所有可下载的资源: ...
- animation of android (2)
android Interpolator 首先是android系统提供的变换方式: 这些方式将转载一篇文章: 转: http://www.cnblogs.com/mengdd/p/3346003.ht ...
- 【JavaScript】JQuery中$.fn、$.extend、$.fn.extend
Web开发肯定要使用第三方插件,对于一个炫丽的效果都忍不住想看看对方是如何实现的,刚下载了一个仿京东商品鼠标经过时局部放大的插件.看了两眼JQuery源码,看看就感觉一头雾水.JQuery本来自己学的 ...
- cocos2d-x之物理引擎初试
发现问题:监听代码部分不能在onEnter()段书写 bool HelloWorld::init() { if ( !Layer::init() ) { return false; } visible ...