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# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值 ...
随机推荐
- hd acm1013
Problem Description(数根) The digital root of a positive integer is found by summing the digits of the ...
- hbase shell-security(安全指令)
hbase shell安全指令篇: grant list_security_capabilities revoke user_permission 正在编辑中
- expr 数字操作
expr 可以用于计算 [root@rhel6 script]# * * [root@rhel6 script]# 使用expr来判断输入的变量是否为整数, 注意这里的&表示 安静模式(没有 ...
- Oracle数据库设计规范建议
Oracle数据库设计规范建议 1 目的 本规范的主要目的是希望规范数据库设计,尽量提前避免由于数据库设计不当而产生的麻烦:同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的很好的保证 ...
- JQuery- JQuery学习
jQuery与JavaScript加载页面的区别 1.JavaScript传统的方式页面加载会存在覆盖问题,加载比jQuery慢(整个页面加载完毕<包含里面的其他内容,比如图片>) 2.j ...
- java:maven中webapp下的jsp不能访问web-inf下面的bean
java:maven中webapp下的jsp不能访问web-inf下面的bean 当然 WEB-INF下面的文件是不能访问的,只能吧jsp文件放入到WEB-INF下面,然后通过配置WEB-INF下we ...
- fatal error C1071: unexpected end of file found in comment
1.错误 #include<iostream> using namespace std; int main() { ..... return 0; } //如果把注释放到这里了,那么提交就 ...
- linux命令学习笔记(36):diff 命令
diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方. diff在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件.diff程序 ...
- 【leetcode刷题笔记】Longest Consecutive Sequence
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...
- 将session存入数据库,memcache的方法
//存入数据库 <?phpif(!$con = mysql_connect('localhost','root','123456')){ die('连接数据库失败');}$link = m ...