A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

out参数与ref参数有那些区别啊,分别都在什么时候用?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

7 个回复

正序浏览
ref都是在参数传递时,传递变量的引用。用于希望方法中多个变量值更改后,在方法调用后保留更改的值。
当一个方法需要多个返回值时,靠方法返回值就不能胜任,幸好.Net有out和ref关键字。
比如:登录方法,登录结果有成功和失败,但是如果失败还要知道原因仅靠返回值就不行了,这个就可以用out和ref
bool Login(string name,string password,ref|out string errMsg){……}
out方法参数传递前可以不赋值,但是方法中必须先赋值后使用;
ref方法参数传递前必须赋值,方法中可以直接使用。
out侧重输出(方法传递前,不知道值,调用方法后获得值),
ref侧重更改(调用方法前就有明确的值,方法中发生更改)。
那么刚才登陆的例子到底用ref还是out呢?这样分析:如果成功是不需要errMsg的,如果失败调用前errMsg的实参是不需要赋值的,所以应该侧重于输出,使用out比较合适。
bool Login(string name,string password,out string errMsg){……}

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
今天刚看过这个视频,在入门的第三天还是第四天中有讲,很详细。
out用来实现一个方法返回多个值
int b ;
int i = Fangfa(a,out b);
b不用赋初值就可以直接使用,因为在方法Fangfa中必定会为b赋值,然后通过一系列的运算,方法结束后,b的值就等于Fangfa里b最后运算出来的值,然后Fangfa还返回了一个整形被 i 接收了。
实际应用中有  int.tryParse("",out b)   如果转换成功,则tryParse返回一个true,同时变量b等于转换后的数,否则返回false,b等于null

ref 相当于指针,指向同一块地址的不同名字,你ref某个变量的时候,就已经在使用它了,所以要赋初值,用ref接收到值的方法中,对它的任何操作,都直接反应在你ref传进去的那个变量上,因为它们其实是同一个东西。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
ref ,out 其实都可以说是引用传递,区别于值传递。
ref : 传递前必须初始化,out:不必初始化,就算初始化,也会被无视,out 作为输出参数,可以解决函数只有一个返回值的问题,

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
两个的区别就是,ref要初始化,另一个不用
不过两个都可以在内部修改他的值
具体什么时候用,ref主要还是对于值类型
out可以处理一个没有初始化的数组,out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
ref是传递参数的地址,out是返回值。使用ref前必须对变量赋值,out不用。out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值,ref引用的可以修改,也可以不修改。
  区别可以参看下面的代码:

using System;
class TestApp
{
 static void outTest(out int x, out int y)
 {//离开这个函数前,必须对x和y赋值,否则会报错。
  //y = x;
  //上面这行会报错,因为使用了out后,x和y都清空了,需要重新赋值,即使调用函数前赋过值也不行
  x = 1;
  y = 2;
 }
 static void refTest(ref int x, ref int y)
 {
  x = 1;
  y = x;
 }
 public static void Main()
 {
  //out test
  int a,b;
  //out使用前,变量可以不赋值
  outTest(out a, out b);
  Console.WriteLine("a={0};b={1}",a,b);
  int c=11,d=22;
  outTest(out c, out d);
  Console.WriteLine("c={0};d={1}",c,d);

  //ref test
  int m,n;
  //refTest(ref m, ref n);
  //上面这行会出错,ref使用前,变量必须赋值

  int o=11,p=22;
  refTest(ref o, ref p);
  Console.WriteLine("o={0};p={1}",o,p);
 }
}
方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。
若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。
不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。
属性不是变量,不能作为 out 参数传递。
        方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。
传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。
属性不是变量,不能作为 ref 参数传递。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 许庭洲 于 2012-9-18 09:45 编辑

ref 传递前必须初始化;而out不必初始化,就算初始化,也会被无视。
回复 使用道具 举报
ref必须先初始化,因为是引用,所以必须先"有“,才能引用,而out则是内部为外部复制,所以不需要初始化,而且初始化也没用。
ref应用于场景内部对外部的值进行改变,out则是内部为外部变量复制,out一般用在函数有多个返回值的场所。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马