您好,登录后才能下订单哦!
一.ref关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何改变都将反
映在该变量中。若要使用ref参数,则方法定义和调用方法都必须显式使用ref关键字。也即是说,在方法中对参数的
设置和改变将会直接影响函数调用之处。无论函数的定义还是调用时均不可忽略关键字ref。
代码①:
static void Main(string[] args) { int x = 10; int y = 20; M(ref x, ref y); Console.WriteLine("x = {0} , y = {1}" , x , y); Console.ReadLine(); } static void M(ref int a , ref int b) { a = 521; b = 520; }
代码②:
static void Main(string[] args) { int x = 10; int y = 20; M(ref x, ref y); Console.WriteLine("x = {0} , y = {1}" , x , y); Console.ReadLine(); } static void M(ref int a , ref int b) { a = 1000; b = 1; }
在此可以看出,在方法中对参数所做的任何更改都将反映在该变量中,而在main函数中对参数的赋值却没有起到作用
,这是不是说明不需要进行初始化呢?看下面一个例子。
代码③:
static void Main(string[] args) { int x ; int y ; M(ref x, ref y); //使用了未赋值的局部变量 x,y 。必须要初始化,否则编译通不过 Console.WriteLine("x = {0} , y = {1}" , x , y); Console.ReadLine(); } static void M(ref int a , ref int b) { a = 521; b = 520; }
二.这说明,ref定义的参数在使用前必须初始化 , 无论在函数定义的时候参数有没有赋予初始值。这条正好区分
out指定的参数可以不在调用函数的时候进行初始化。
三.对out来说,第一条同样适用。将代码①以及②中的ref全部改成out,则可与使用ref得到同样的结果。
四.out指定的参数必须在函数定义的时候就赋初始值。否则出现错误。对比ref指定的参数则
可以不在函数内部赋初始值,在函数调用的时候在函数调用的时候哦在赋值也可以。
static void Main(string[] args) { int x = 10; int y = 11; M(ref x, ref y); Console.WriteLine("x = {0} , y = {1}" , x , y); Console.ReadLine(); } static void M(ref int a , ref int b) { int temp; temp = a; a = b; b = temp; }
代码④:
static void Main(string[] args) { int x = 10; int y = 11; M(out x, out y); Console.WriteLine("x = {0} , y = {1}" , x , y); Console.ReadLine(); } static void M(out int a , out int b) { int temp; temp = a;//使用了未赋值的out参数,a在参数内部没有赋值,所以出错。 a = b;//使用了未赋值的out参数,b在参数内部没有赋值,所以出错。 b = temp; }
总结以上四条得到ref和out使用时的区别是:
①.ref指定的参数(例子中的a,b)在函数调用时必须初始化不能为空的引用(x,y)。而指定的参数在函数调用时可以
不初始化(
static void M(ref int a , ref int b) { int temp; temp = a; a = b; b = temp; }
)。
②.out指定的参数在进入函数时会清空自己,必须在函数内部赋初始值。而ref指定的参数不需要。
static void Main(string[] args) { int x ; int y ; M(out x, out y); Console.WriteLine("x = {0} , y = {1}" , x , y); Console.ReadLine(); } static void M(out int a, out int b) { a = 1111; b = 22222; }
用ref时,例子中的x,y必须初始化值,a,b随便;用out时,M()方法中的参数a,b必须在M()方法内部初始化值,x,y随便。
===========================================================================================
ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数, 可使用ref或out关键字。ref和out这两个关键字都能够提供相似的功效,
其作用也很像C中的指针变量。它们的区别是:
1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。
3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。
out方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。
若要使用out参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。
不必初始化作为out参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。
属性不是变量,不能作为out参数传递。
ref是有进有出,而out是只出不进。
=======================================================================================
函数参数默认是值传递的,也就是“复制一份”。
out和ref传递的都是引用而不是值,out侧重于输出使用之前不需赋值而ref在使用之前需要赋值,另外这两个关键字可以变相实现使一个方法输出多个值。
1.写一个方法,实现MyTryParse的功能
bool MyTryParse(string s,out intresult)
用户只能输入0到100之间的数写一个方法,否则提示超出范围
返回值表示解析是否成功,result代表解析后的整型值
1.形参和实参指向同一地址
2.始终保证形参和实参指向同一地址
ref和out不一样:
ref在实参传入时保留其值 而out消除其值
方法编写的时候的选择:
若方法只有一个返回值 选择使用返回值类型
例:
public static int ReturnInt() { return 1; }
如果返回值多于1个 选择使用out
public static void ReturnInt(out int a,out int b) { //a、b赋初值 // a、b参与运算 }
调用时: int c;int d; ReturnInt(out c,out d);
如果需要直接将结果返回到某一个变量上 使用ref
public static void ChangeString(ref String s) { s= "000"+s; }
调用时: String ss = "1"; ChangeString(ref ss);
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。