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

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

两者都是按地址传递的,使用后都将改变原来的数值。
ref可以把参数的数值传递进函数,但是out是要把参数清空
就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。
两个的区别:ref是有进有出,out是只出不进。

代码实例如下:

 1 namespace TestOutAndRef
 2 {
 3     class TestApp
 4     {
 5 
 6  static void outTest(out int x, out int y)
 7  {//离开这个函数前,必须对x和y赋值,否则会报错。
 8   //y = x;
 9   //上面这行会报错,因为使用了out后,x和y都清空了,需要重新赋值,即使调用函数前赋过值也不行
10   x = 1;
11   y = 2;
12  }
13  static void refTest(ref int x, ref int y)
14  {
15   x = 1;
16   y = x;
17  }
18 
19 
20  static public void OutArray(out int[] myArray)
21  {
22      // Initialize the array:
23      myArray = new int[5] { 1, 2, 3, 4, 5 };
24  }
25  public static void FillArray(ref int[] arr)
26  {
27      // Create the array on demand:
28      if (arr == null)
29          arr = new int[10];
30      // Otherwise fill the array:
31      arr[0] = 123;
32      arr[4] = 1024;
33  }
34 
35 
36  public static void Main()
37  {
38   //out test
39   int a,b;
40   //out使用前,变量可以不赋值
41   outTest(out a, out b);
42   Console.WriteLine("a={0};b={1}",a,b);
43   int c=11,d=22;
44   outTest(out c, out d);
45   Console.WriteLine("c={0};d={1}",c,d);
46 
47   //ref test
48   int m,n;
49   //refTest(ref m, ref n);
50   //上面这行会出错,ref使用前,变量必须赋值
51 
52   int o=11,p=22;
53   refTest(ref o, ref p);
54   Console.WriteLine("o={0};p={1}",o,p);
55 
56 
57 
58   int[] myArray1; // Initialization is not required
59 
60   // Pass the array to the callee using out:
61   OutArray(out myArray1);
62 
63   // Display the array elements:
64   Console.WriteLine("Array1 elements are:");
65   for (int i = 0; i < myArray1.Length; i++)
66       Console.WriteLine(myArray1[i]);
67 
68   // Initialize the array:
69   int[] myArray = { 1, 2, 3, 4, 5 };
70 
71   // Pass the array using ref:
72   FillArray(ref myArray);
73 
74   // Display the updated array:
75   Console.WriteLine("Array elements are:");
76   for (int i = 0; i < myArray.Length; i++)
77       Console.WriteLine(myArray[i]);
78  }
79     }
80 
81 }

运行结果 如下:
   

转载于:https://www.cnblogs.com/abcdwxc/archive/2007/09/14/893032.html

C#中out 及 ref 区别相关推荐

  1. reactive和ref区别

    reactive与ref区别 1. 从定义数据方面: ref通常用来定义基本类型数据 reactive用来定义:对象(或者数组)类型数据 ref也可以用来定义对象或者数组类型的数据,内部会通过reac ...

  2. mybatis与php,浅谈mybatis中的#和$的区别

    浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...

  3. 关于EF中ApplyCurrentValues和ApplyOriginalValues区别

    关于EF中ApplyCurrentValues和ApplyOriginalValues区别:两者都是编辑数据时使用. //         // 摘要:         //     将 System ...

  4. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  5. JAVA 中equals()与==的区别

    原文地址:http://www.chineselinuxuniversity.net/articles/29594.shtml 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存 ...

  6. python时间函数报错_python3中datetime库,time库以及pandas中的时间函数区别与详解...

    1介绍datetime库之前 我们先比较下time库和datetime库的区别 先说下time 在 Python 文档里,time是归类在Generic Operating System Servic ...

  7. java中Array和ArrayList区别 可以将 ArrayList想象成一种会自动扩增容量的Array

    java中Array和ArrayList区别 1)精辟阐述: 可以将 ArrayList想象成一种"会自动扩增容量的Array https://blog.csdn.net/ywjy10280 ...

  8. SQL点滴31—SQL语句中@@IDENTITY和@@ROWCOUNT区别

    原文:SQL点滴31-SQL语句中@@IDENTITY和@@ROWCOUNT区别 SQL语句中@@IDENTITY和@@ROWCOUNT区别 在一条 INSERT.SELECT INTO 或大容量复制 ...

  9. android r类 作用,Android 主项目和 Module 中 R 类的区别

    Android 主项目和 Module 中 R 类的区别 我们知道 Android 项目中会通过自动生成一个 R.java 类的方式来保存项目中所有资源文件的标识在主项目中生成的 R.java 中的资 ...

最新文章

  1. python处理图片文件_python 学习(二)处理图片、TXT文档
  2. Linux网络那点事(CentOS、Ubuntu、Kali)
  3. freemaker页面字符串特殊字符显示异常处理
  4. android this context,Android應用開發中關於this.context=context的理解
  5. nc 模拟服务器_Go实战——实现一个并发时钟服务器
  6. Socket详解——全面明了
  7. Android编译笔记四
  8. Typora一次编辑,知乎、CSDN等多平台快速发布:Typora + PicGo + 图床
  9. [转载] pythonpandas读取csv文件最后一行_简单小案例(一):使用Pandas在Python中读取和写入CSV文件...
  10. unity插件共享汇总大全
  11. 漫话:如何给女朋友解释为什么12306会用户信息泄露(上)——密码篇
  12. 基于C#程序触摸屏软件盘开发总结
  13. 新世纪版五笔字根高清版
  14. springboot 签名验证
  15. 天是岸:优秀的网络营销推广人,身上一般都具备这7大特质
  16. 极致CMS百度智能小程序前后端源码
  17. 有关前端的一些问题(一)
  18. 光敏二极管血氧仪方案设计研发
  19. python如何读取weboutlook内容_用Python通过MAPI读取Outlook中的电子邮件
  20. 制作一个评选优秀老师和学生的系统,系统根据提示输入类别(老师或学生), 如果是老师则输入姓名和论文数,学生则输入姓名和考试成绩,输入若干人员信息后使用结束符完成输入,程序根据输入的数据列出优秀老师和优

热门文章

  1. 看别人的C/C++代码时发现自己所不知道的语法~
  2. 用python监控磁盘_使用python怎么对服务器cpu和磁盘空间进行监控
  3. VB.NET 从main函数里启动窗口
  4. JavaScript框架
  5. 给普通用户赋予docker权限
  6. 华北理工大学轻工学院计算机在哪个校区,如何坐公交去路北区的华北理工大学轻工学院(北校区)-行政综合楼| Moovit...
  7. mysql内联表格使用索引_【求助】MYSQL表关联内联视图不走索引问题??诡异啊...
  8. 论文翻译-机器翻译:Attention
  9. Jquery 改变样式
  10. (转)JS正则表达式元字符