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参数的区别的更多相关文章

  1. C#中的out 参数,ref参数,值参数

    大家可能在编码中或多或少的使用过out的ref,但是是否注意过他两的详细用法以及区别? 本文想介绍下详细介绍下out参数,ref参数以及一般值参数. 值参数 在使用参数时,把一个值传递给函数使用的一个 ...

  2. 给方法传递参数:ref参数和out参数

    /*--------------------------------------------------- 给方法传递参数:ref参数和out参数 (P106) ------------------- ...

  3. C#总结---方法的out参数和ref参数

    我们知道,在c#中,当我们在一个方法中想要访问另一个方法中的变量的时候,有两种解决方案---参数和返回值.但当需要返回多个值,并且是不同类型的值的之后应该怎么办呢?解决方案可以是 (1)将所有类型数据 ...

  4. out参数,ref参数,params参数数组

    params参数数组 params关键字可以为方法指定数目可变的参数.params关键字修饰的参数,可以传入任意数目的同类型参数,甚至可以不传入参数. 不过params修饰的参数必须是方法的最后一个参 ...

  5. 方法的形参、ref参数、out参数的区别

    我们在定义方法时,经常会涉及到传参.因为引用类型的数据在用变量存储时,是存储的地址,所以在传参时,依然是传递的地址,但是值类型的数据在传参时就会有所不同.值类型数据在调用方法传参时,普通情况下是值传递 ...

  6. c#基础学习(0724)之可变参数、ref和out

    params可变参数,无论有几个参数,必须出现在参数列表的最后,可以为可变参数直接传递一个对应类型的数组 #region 可变参数 //1.如果方法有多个参数,可变参数可以作为最后一个参数 //2.可 ...

  7. ref 参数与out参数

    变量作为参数传给方法,同时希望在方法执行完成后对参数,反应到变量上面.就需要用到ref和out这两个参数. ref参数:在 传入前必须先初始化 out参数:不需要做预先的处理

  8. C#中的Params、ref、out的区别

    C# Params params params 关键字可以指定在参数数目可变处采用参数的方法参数. 在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params ...

  9. ref与out区别(ref有进有出,而out只出不进)

    ref与out区别(ref有进有出,而out只出不进)   C#基础:ref和out的区别 ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值 ...

随机推荐

  1. 斯坦福机器学习视频笔记 Week1 线性回归和梯度下降 Linear Regression and Gradient Descent

    最近开始学习Coursera上的斯坦福机器学习视频,我是刚刚接触机器学习,对此比较感兴趣:准备将我的学习笔记写下来, 作为我每天学习的签到吧,也希望和各位朋友交流学习. 这一系列的博客,我会不定期的更 ...

  2. Spring Cloud之服务治理(注册发现)

    服务治理SpringCloud Eureka 什么是服务治理 在传统rpc远程调用中,服务与服务依赖关系,管理比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用.负载均衡.容 ...

  3. RabbitMQ之Exchange Direct模式

    场景: 生产者发送消息到交换机并指定一个路由key, 消费者队列绑定到交换机时要指定路由key(key匹配就能接受消息,key不匹配就不能接受消息) 例如:我们可以把路由key设置为insert ,那 ...

  4. 启动Hive时报错

    报错信息如下 Logging initialized -bin/lib/hive-common-.jar!/hive-log4j.properties Exception in thread &quo ...

  5. Java 集合常用特点

    1:集合:1) Collection(单列集合) ---------------------------------------------------------------------       ...

  6. 优秀开源项目之一:视频监控系统iSpy

    iSpy是一个开源的视频监控软件,目前已经支持中文.自己用了一下,感觉还是很好用的.翻译了一下它的介绍. iSpy将PC变成一个完整的安全和监控系统 iSpy使用您的摄像头和麦克风来检测和记录声音或运 ...

  7. BZOJ3812 清华集训2014 主旋律

    直接求出强联通生成子图的数量较难,不妨用所有生成子图的数量减去非强联通的. 非强联通生成子图在所点后满足编号最小的点所在的强联通分量不是全集. 由于$n$很小,我们可以考虑状态压缩. 对于点集$S$, ...

  8. NOIp2018集训test-10-18 (bike day4)

    这是一套简单题,这几天的考试让bike老爷感觉很绝望,说实话我也确实不知道还能怎么更简单了. 这几天的题换做llj.sxy应该都能轻松AK吧,至少随便考个250+应该不是问题吧,我越来越觉得觉得我跟他 ...

  9. Nested loops、Hash join、Sort merge join(三种连接类型原理、使用要点)

    nested loop 嵌套循环(原理):oracle从较小结果集(驱动表.也可以被称为outer)中读取一行,然后和较大结果集(被侦查表,也可以叫做inner)中的所有数据逐条进行比较(也是等值连接 ...

  10. HBase的bulkLoad

    HBase的BulkLoad有两种方式: thinrow的机制是flatmap把cell的信息进行flatmap:适合少于1万列的数据集:thinrow的涵义就是少行多列: bulkload的机制则是 ...