ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。使用ref前必须对变量赋值,out不用。
out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值,ref引用的可以修改,也可以不修改。

如果你想返回多个值怎么办,OUT....

  区别可以参看下面的代码:

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);
 }
}

ref和out都是C#中的关键字,所实现的功能也差不多,都是指定一个参数按照引用传递。对于编译后的程序而言,它们之间没有任何区别,也就是说它们只有语法区别。总结起来,他们有如下语法区别:

1、ref传进去的参数必须在调用前初始化,out不必,即:
int i;
SomeMethod( ref i );//语法错误
SomeMethod( out i );//通过
2、ref传进去的参数在函数内部可以直接使用,而out不可:
public void SomeMethod(ref int i)
{
   int j=i;//通过
   //...
}
public void SomeMethod(out int i)
{
   int j=i;//语法错误
}
3、ref传进去的参数在函数内部可以不被修改,但out必须在离开函数体前进行赋值。

总结:
应该说,系统对ref的限制是更少一些的。out虽然不要求在调用前一定要初始化,但是其值在函数内部是不可见的,也就是不能使用通过out传进来的值,并且一定要赋一个值。也就是说函数承担初始化这个变量的责任。

转自:http://www.cnblogs.com/xuezheng/archive/2007/08/20/862769.html

转载于:https://www.cnblogs.com/guodapeng/archive/2007/09/23/903543.html

c#中out和ref的使用区别 [转]相关推荐

  1. C#中out和ref之间的区别【转】

    首先:两者都是按地址传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所 ...

  2. C#中out和ref使用的区别

    看了网上许多关于out和ref关键字的使用介绍,自己为了方便记住,稍微简略总结了下两者的区别: a. 赋值: (1)ref要求变量使用前必须先赋值(2)out不必要,赋了也没关系,但会清零 b. 传出 ...

  3. Mysql执行计划中eq_ref和ref类型的区别

    下面是一位大佬的回复,我觉得挺好理解的,就来记录下. 文章目录 eq_ref ref eq_ref eq_ref - 想象你有两张桌子.表A包含列(id,text),其中id是主键.表B具有相同的列( ...

  4. ref out param 区别

    如果在方法声明参数中未使用ref或out关键字,在方法中更改参数的值,当控制传递回调用过程时,不会保留更改的值:我们可以通过方法参数关键字,更改这种行为. 1.ref 2.out 3.params r ...

  5. 浅谈ref与out区别

    今天又一次碰到了ref与out区别的问题,当初总认为自己学的还不错,但每次遇到后都要纠结一番,这次再次学习和巩固一下. MSDN中的定义: ref 关键字使参数按引用传递.其效果是,当控制权传递回调用 ...

  6. php中什么时候用传值,php中传值与传引用的区别。什么时候传值什么时候传引用?...

    java中的this与super的区别 java中的this与super的区别 1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位 代码如下: class Base { Ba ...

  7. vue3 ref 和 reactive 区别

    前言 最近学习cloud项目,前端使用到 vue3 + ts 等技术,在写需求过程中遇到响应式数据问题,经百度查找相关笔记,在此记录一下,在实战中成长吧. 问题 出现的问题:定义一个默认数组并且 fo ...

  8. sql语句中left join和inner join中的on与where的区别分析

    原文:sql语句中left join和inner join中的on与where的区别分析 关于SQL SERVER的表联接查询INNER JOIN .LEFT JOIN和RIGHT JOIN,经常会用 ...

  9. 无法解析 list 中的方法 iterator_Python-list中的append()和extend()方法区别

    一.append()和extend()方法都是用来添加数据到list末尾的,两者的区别: append()添加的时候会把添加的数据当成一个整体进行添加,允许添加任意类型的数据 extend()添加的时 ...

最新文章

  1. CSS Guide Lines
  2. framebuffer的入门介绍-实现程序分析【转】
  3. opencv 人脸识别 (二)训练和识别
  4. 软考-信息系统项目管理师-项目质量管理
  5. Oracle建立约束、删除约束
  6. Linux网络编程--文件描述符
  7. 怎样格式化电脑_硬盘数据销毁最安全的步骤是怎样的?有公司可以做吗
  8. Python里的++和--不是运算符
  9. VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)
  10. Linux下make -j加快编译速度
  11. 林子雨大数据软件安装和编程指南导航
  12. js书写原生ajax,JS 原生ajax写法
  13. DCFNET:用于视觉跟踪的判别相关滤波器网络
  14. 2021年西式面点师(中级)报名考试及西式面点师(中级)证考试
  15. 想要运营公众号?公众号形象定位有哪些?
  16. 如何增长U盘的寿命- 小技巧
  17. 对于pytorch中nn.CrossEntropyLoss()与nn.BCELoss()的理解和使用
  18. c++plus_6th_第4章
  19. 如何用计算机控制家带你开关,计算机控制系统复习点及答案
  20. C# GroupBy 用法

热门文章

  1. 用telnet命令,POP3接收邮件
  2. FCKeditor在线文本编辑器初级应用
  3. 百度无线用户体验部2011年招聘计划
  4. pod setup 慢 的问题
  5. SQL Server 跨域访问
  6. acm算法模板(1)
  7. 处理图片(updated)
  8. 程序Crash后的调试技巧
  9. 数据仓库经验小结(转)
  10. numpy中的axis=0,axis=1