关于c#中”ref”和”out”关键字的一些理解
2015-01-05 22:47
302 查看
一. 综述(本文内容大部分来自网络,经本人整理而成,仅供学习参考,不免理解错误,欢迎批评指正)
在c#中,方法的参数传递有四种类型:
(1) 传值参数(by value)
传值参数无需额外的修饰符。传值参数在方法调用过程中,如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此而改变,而是保持原来传入的值。实际
上,传值参数传递的是调用参数的一份拷贝,因此在调用方法的过程中,即使改变了参数的值,也不会影响到实际传入的参数值,详见例程:
(2) 传址参数(by reference)
传址参数需要修饰符ref(关键字),传址参数如果在方法的调用过程中改变了参数的值,那么传入方法的参数在调用完成以后也随之改变。传址参数传递的是调用参数的 内存地址,该参数在方法内外指向同一个存储位置。因此,在调用方法过程中如果改变了参数的值,呢么实际出入的参数值也会随之改变,详见例程:
方法参数上的ref方法参数关键字,使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
若要使用ref参数,必须将参数作为ref参数显示传递到方法;
传递到ref参数的参数必须先初始化;
属性不是变量,不能作为ref参数传递;
(3) 输出参数(by output)
输出参数需要修饰符out(关键字)。
方法参数上的out方法参数关键字,使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
当希望方法返回多个值时,声明out方法非常有用。使用out参数的方法仍然可以返回一个值,一个方法可以有一个以上的out参数。
在使用out参数前,不必初始化作为out参数传递的变量,然而必须在方法返回之前为out参数赋值。
属性不是变量,不能做为out参数传递。
(4)数组参数(by array)
数组参数需要修饰符params。
2. ref关键字与out关键字的区别
在c#中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持更改,若要通过引用传递参数,可使用ref和out关键字。ref和 out都可以提供相似的功效,其作用也很想c中的指针变量。它们的区别是:
(1)使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
(2)使用ref和out时,在方法的参数和执行方法时,都要加ref或out关键字,以满足匹配。
(3)out适合用在需要return多个返回值的地方,而ref则用在需要被调用的方法修改修改调用者的引用的时候。
二. 例程
在c#中,方法的参数传递有四种类型:
(1) 传值参数(by value)
传值参数无需额外的修饰符。传值参数在方法调用过程中,如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此而改变,而是保持原来传入的值。实际
上,传值参数传递的是调用参数的一份拷贝,因此在调用方法的过程中,即使改变了参数的值,也不会影响到实际传入的参数值,详见例程:
(2) 传址参数(by reference)
传址参数需要修饰符ref(关键字),传址参数如果在方法的调用过程中改变了参数的值,那么传入方法的参数在调用完成以后也随之改变。传址参数传递的是调用参数的 内存地址,该参数在方法内外指向同一个存储位置。因此,在调用方法过程中如果改变了参数的值,呢么实际出入的参数值也会随之改变,详见例程:
方法参数上的ref方法参数关键字,使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
若要使用ref参数,必须将参数作为ref参数显示传递到方法;
传递到ref参数的参数必须先初始化;
属性不是变量,不能作为ref参数传递;
(3) 输出参数(by output)
输出参数需要修饰符out(关键字)。
方法参数上的out方法参数关键字,使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
当希望方法返回多个值时,声明out方法非常有用。使用out参数的方法仍然可以返回一个值,一个方法可以有一个以上的out参数。
在使用out参数前,不必初始化作为out参数传递的变量,然而必须在方法返回之前为out参数赋值。
属性不是变量,不能做为out参数传递。
(4)数组参数(by array)
数组参数需要修饰符params。
2. ref关键字与out关键字的区别
在c#中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持更改,若要通过引用传递参数,可使用ref和out关键字。ref和 out都可以提供相似的功效,其作用也很想c中的指针变量。它们的区别是:
(1)使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
(2)使用ref和out时,在方法的参数和执行方法时,都要加ref或out关键字,以满足匹配。
(3)out适合用在需要return多个返回值的地方,而ref则用在需要被调用的方法修改修改调用者的引用的时候。
二. 例程
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace ConsoleApplication5 { class Program { //使用普同传值参数的函数 static void ValueTest(int x, int y) { x = 3; y = 3; } //使用ref传址参数的函数 static void RefTest(ref int x, ref int y) { x = 1; y = x; } //使用out输出参数的函数 static void OutTest(out int x, out int y) { //离开这个函数前,必须对x和y赋值,否则会报错 //y = x; //上面这行会报错,因为使用了out后,x和y都清空了,需要重新赋值,即使调用函数前赋过值也不行 x = 1; y = 2; } static void Main(string[] args) { /************测试普通的传值参数*******************/ int a = 4; int b = 7; ValueTest(a, b);//调用该函数不会改变变量a,b的值 Console.WriteLine("a={0};b={1}", a, b);//此处输出a,b的值分别为4,7 /************测试“ref”*******************/ //int m; //int n; //RefTest(ref m, ref n); //上面这行会出错,ref使用前,变量m,n必须赋值 int o = 11; int p = 22; RefTest(ref o, ref p); Console.WriteLine("m={0};n={1}", o, p);//o和p的值将会变为RefTest函数中所改变的值,此处输出o为1,,p为1 /************测试普通的传值参数*******************/ //使用out参数时,可以先不对变量c,d进行初始化 int c; int d; OutTest(out c, out d);//c和d的值将会变为OutTest函数中所改变的值,此处输出c为1,,d为2 Console.WriteLine("c={0};d={1}", c, d); Console.ReadLine(); } } }
相关文章推荐
- 关于C#中 out/ref的一些个人理解
- DEMO[C#]refKeyword and outKeyword 关于ref与out关键字区别的DEMO
- C# Out/Ref关键字的理解和区别
- DEMO[C#]refKeyword and outKeyword 关于ref与out关键字区别的DEMO
- 关于C#中的ref 和 out 关键字的区别
- 关于C#中ref与out参数的理解
- CLR via C# 读书笔记(五)关于“out”和“ref”关键字
- 用MSIL剥开C#的外衣(一):方法参数ref、out、params和lock、for和foreach关键字
- 关于ref,out,params参数的理解(粘贴的源代码,说明在注释里面)
- 正确理解 C# 中的 ref 关键字 (续)
- 正确理解 C# 中的 ref 关键字
- 正确理解 C# 中的 ref 关键字
- 关于C#中的ref和out参数的说明
- C# 中的ref & out关键字 的区别
- C# ref和out关键字
- 对于关键字Ref和Out的理解
- 正确理解C#中的ref关键字
- C# 参考之方法参数关键字:params、ref及out
- 理解C#中的ref关键字
- C# 参考之方法参数关键字:params、ref及out