C# 中out 参数 和 ref参数的区别
C#中共有4种参数类型,分别是 传值(by value), 传址 (by reference), 输出参数 (by output), 数组参数 (by array)
by value => 传值参数不需要额外的修饰符. 传值参数在方法调用过程中如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此改变,而是保留原来传入时的值. 传值参数传递的是调用参数的一份拷贝
by reference => 传址参数需要修饰符 ref. 传址参数如果在方法调用过程改变了参数的值,那么传入方法的参数在调用完成以后也随之改变。 传址参数传递的是调用参数的内存地址,该参数在方法内外指向的是同一个存储位置.
by out => 输出参数需要修饰符 out
by array => 数组参数需要修饰符 params
而ref 和out两者,都是按照地址传递的 (像C中的指针变量), 使用后都将改变原来参数的数值. 两者区别
ref: 传入的参数必须先被初始化,也就是说会把已经初始化的参数的数值传递进函数。 所以 ref是有进又出
out: out传入的参数是没有值得,也就是说你是无法把一个数值通过out参数传递进函数中去的。 out 参数传进函数中后,该参数数值为空,所以说你必须初始化一次, 并且要保证所有的out参数在函数返回前都要赋值。 所以 out是只出不进
Ref关键字使参数按引用传递. 其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中. 使用ref参数,则方法定义和调用方法都必须显示使用ref关键字.
eg:
class RefExample
{
static void Method(ref int i)
{
i = ;
} static void Main()
{
int val = ;
Method(ref val);
// val is now 44
}
}
上面的代码也可以看出,传递到ref参数的参数必须最初初始化. 这与out不同,后者的参数在传递之前不需要显示初始化.
尽管ref和out在运行时的处理方式不同,但在编译时的处理方式相同。所以,如果一个方法采用ref参数,而另一个方法采用out参数,则无法重载这两个方法。 eg: 从编译的角度来看,以下代码中的两个方法是完全相同的,因此将不会编译以下代码:
class Test_Example
{
// Compiler error CS0663: "cannot define overloaded
// methods that differ only on ref and out".
public void TestMethod(ref int i) { }
public void TestMethod(out int i) { }
}
但是,如果一个方法采用ref或out参数,而另一个方法不采用这两个参数,则可以进行重载. eg:
class RefOutOverloadExample
{
public void TestMethod(int i) { }
public void TestMethod(ref int i) { }
}
Out 关键字也会导致参数通过引用来传递,这一点与ref关键字是一样的。不同的是,ref要求变量必须在传递之前进行初始化,而out则不需要,out 参数即使初始化了,也不会把初始化的值传入到函数中去。
若要使用out参数,方法定义和调用方法都必须显示使用out关键字
class OutExample
{
static void Method(out int i)
{
i = 30;
} static void Main()
{
int value;
Method(out value);
// value is now 30
}
}
所以,如下代码是错误的
int v3 = ; void MyMethod3(out v3);
{
Console.WriteLine(v3); //在函数内部,没有对v3进行初始化,也没有保证v3在函数返回前赋值 }
以上文章参考 http://www.cnblogs.com/gsk99/archive/2010/12/13/1904557.html
C# 中out 参数 和 ref参数的区别的更多相关文章
- C#中的out 参数,ref参数,值参数
大家可能在编码中或多或少的使用过out的ref,但是是否注意过他两的详细用法以及区别? 本文想介绍下详细介绍下out参数,ref参数以及一般值参数. 值参数 在使用参数时,把一个值传递给函数使用的一个 ...
- 给方法传递参数:ref参数和out参数
/*--------------------------------------------------- 给方法传递参数:ref参数和out参数 (P106) ------------------- ...
- C#总结---方法的out参数和ref参数
我们知道,在c#中,当我们在一个方法中想要访问另一个方法中的变量的时候,有两种解决方案---参数和返回值.但当需要返回多个值,并且是不同类型的值的之后应该怎么办呢?解决方案可以是 (1)将所有类型数据 ...
- out参数,ref参数,params参数数组
params参数数组 params关键字可以为方法指定数目可变的参数.params关键字修饰的参数,可以传入任意数目的同类型参数,甚至可以不传入参数. 不过params修饰的参数必须是方法的最后一个参 ...
- 方法的形参、ref参数、out参数的区别
我们在定义方法时,经常会涉及到传参.因为引用类型的数据在用变量存储时,是存储的地址,所以在传参时,依然是传递的地址,但是值类型的数据在传参时就会有所不同.值类型数据在调用方法传参时,普通情况下是值传递 ...
- c#基础学习(0724)之可变参数、ref和out
params可变参数,无论有几个参数,必须出现在参数列表的最后,可以为可变参数直接传递一个对应类型的数组 #region 可变参数 //1.如果方法有多个参数,可变参数可以作为最后一个参数 //2.可 ...
- ref 参数与out参数
变量作为参数传给方法,同时希望在方法执行完成后对参数,反应到变量上面.就需要用到ref和out这两个参数. ref参数:在 传入前必须先初始化 out参数:不需要做预先的处理
- C#中的Params、ref、out的区别
C# Params params params 关键字可以指定在参数数目可变处采用参数的方法参数. 在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params ...
- ref与out区别(ref有进有出,而out只出不进)
ref与out区别(ref有进有出,而out只出不进) C#基础:ref和out的区别 ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值 ...
随机推荐
- 【Linux不需要磁盘碎片整理的真正原因是因为Linux只是一个内核,它没有磁盘可以整理】
[Linux不需要磁盘碎片整理的真正原因是因为Linux只是一个内核,它没有磁盘可以整理]
- virtualbox 相关操作
关闭 vboxmanage controlvm nenew poweroff 打开,后台运行 vboxmanage startvm centos0 --type headless 复制虚拟机镜像VBo ...
- Codeforces 358D Dima and Hares:dp【只考虑相邻元素】
题目链接:http://codeforces.com/problemset/problem/358/D 题意: 有n个物品A[i]摆成一排,你要按照某一个顺序将它们全部取走. 其中,取走A[i]的收益 ...
- POJ 1270 Following Orders(拓扑排序)
题意: 给两行字符串,第一行为一组变量,第二行时一组约束(每个约束包含两个变量,x y 表示 x <y).输出满足约束的所有字符串序列. 思路:拓扑排序 + 深度优先搜索(DFS算法) 课本代码 ...
- Linux-解决putty无法直接使用root用户远程登录linux主机的问题
问题描述: 有时,在使用putty连接远程linux主机时会发现,无法直接使用root登录, 但是可以使用其他用户登录,然后切换至root用户. 解决办法: 1.修改配置文件 vi /etc/ssh/ ...
- log4net调试
public delegate void LogReceivedEventHandler(object source, LogReceivedEventArgs e); public sealed c ...
- Oracle中spool命令实现的两种方法比较
---恢复内容开始--- 要输出符合要求格式的数据文件只需在select时用字符连接来规范格式.比如有如下表 SQL>; select id,username,password from myu ...
- Solaris/Linux 命令手册
无意翻到之前收藏的一个文档,共享一下. Solaris/Linux 命令手册 1. 系统 # passwd:修改口令 # exit:退出系统 2. 文件 # cp:复制文件或目录,参数:-a递归目录, ...
- ACM学习历程—HDU1030 Delta-wave(数学)
Description A triangle field is numbered with successive integers in the way shown on the picture be ...
- Android的各国语言的缩写
语言包在android工程中的对应关系: 中文(中国):values-zh-rCN 中文(台湾):values-zh-rTW 中文(香港):values-zh-rHK 英语(美国):values-en ...