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. 一步一步带你分析 requirejs

    详细源代码一共就2000多行,来看我这篇分析的同学应该都下载下来了,好了,话不多说,开始: 代码的开头就出现3个全局变量: requirejs, require, define var require ...

  2. HDU1232 畅通工程,并查集

    这里要补充一些知识点,并查集三操作 1.找到父节点递归写法int Findf(int x){ if(father[x]!=x) father[x]=Findf(father[x]); return f ...

  3. 同一台电脑关于多个SSH KEY管理

    运用shh -T -v git@github.com查看具体出错信息,再根据信息来调试    原文链接: http://yijiebuyi.com/blog/f18d38eb7cfee860c117d ...

  4. SpringCloud-断路器(Hystrix)

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用Rest Template + Ribbon和Feign来调用.为了保证其高可用,单 ...

  5. An Assembly Language

    BUFFER OVERFLOW 3 An Assembly Language Introduction Basic of x86 Architecture Assembly Language Comp ...

  6. 【Selenium】Option加载用户配置,Chrom命令行参数

    about:version - 显示当前版本 about:memory - 显示本机浏览器内存使用状况 about:plugins - 显示已安装插件 about:histograms - 显示历史记 ...

  7. Firefox 不知道如何打开此地址,因为协议 (javascrpit) 未和任何程序关联.

    用火狐打开出现这个错误,360没事:这个是什么原因???怎么解决?代码:<a href="javascrpit:;"onclick="showD('pas','ri ...

  8. tomcat使用JDNI配置信息和使用信息。用于JDBC连接池

    JNDI: JNDI(java Naming and Directory Interface),java命名和目录接口.JNDI的作用就是:在服务器上配置资源,然后通过统一的方式来获取配置的资源 在t ...

  9. javaScript-进阶篇(三)

    1.Window对象 window对象是BOM的核心,window对象指当前的浏览器窗口. window对象方法: 2.JavaScript 计时器 在JavaScript中,我们可以在设定的时间间隔 ...

  10. ACM学习历程—BZOJ2956 模积和(数论)

    Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. Input 第一行两个数n,m. Output 一个整数表 ...