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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马—杨磊 中级黑马   /  2013-5-19 17:17  /  1707 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马—杨磊 于 2013-5-21 09:32 编辑

C#out,ref的区别和说明

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

7 个回复

倒序浏览
方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。
若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。
不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。
属性不是变量,不能作为 out 参数传递。

方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。
传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。
属性不是变量,不能作为 ref 参数传递

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
风吹月er落 来自手机 中级黑马 2013-5-19 19:22:14
藤椅
ref 和out 区别
相同点:两者都是按地址传递,使用后都改变原来参数值
不同点:ref 可以把参数值传进函数,而out 把参数清空。即你无法把数值从out 传入,out 进去后参数的数值为空,所以必须初始化。
区别如有的人说的:“ref 是有进有出,out 是只出不进”来自: Android客户端

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
在C#语言中,ref和out是函数形式参数的修饰符,它们的作用都是表示它们所修饰的形式参数是按照引用传递的,也就是说,参数的一个副本被传递到函数中。它们的区别在于当使用ref修饰符时要求在传递参数前对被传递的参数进行初始化,而out修饰符不需要。所以您可以将一个由ref修饰的变量传入一个函数而不对其进行显式的赋值,但是一个由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);
 }
}

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
首先:两者都是按地址传递的,使用后都将改变原来参数的数值。

其次:rel可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,rel是有进有出,out是只出不进。

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
相同点:两者都是引用传递,都能改变要传递参数的值。
区别:
out修饰的参数在传递前可以不用赋初值,但在方法里必须先重新赋值。最后改变要传递参数的值,并返回。。即使传参前赋值,在方法里也不会被使用。
ref修饰的参数在传递前就要赋值,接收的参数无需重新赋值,就可以被方法里的代码调用。最后改变要传递参数的值,并返回。

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

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