话说古时候,在一个名字叫C#的繁华的大城市里面,有两家珠宝加工店,一家叫ref,另外一家叫out。

有一天,有名字叫a和b的两个人每人都各带了一公斤黄金要加工首饰。

a去了ref店,ref的掌柜告诉a说,请客官稍等,我们加工的速度是很快的,大概就一个小时左右吧。a说,我敢时间呢,能不能用我的黄金换现成的首饰。ref老板说,客官,实在是对不起,本店只为客人加工,我们没有这样的服务。如果您敢时间的话,我推荐您去out店,他们专门做这样的业务。

b去了out店,说,掌柜的,你必须要用我的这一公斤黄金给我加工首饰。out店的掌柜不好意思的笑了笑,客官实在是对不起我们这里只用黄金交换加工好了的首饰。我们不提供加工的服务,你可以去ref店,他们专门做这样的业务。

就这样,两家店各做各的,都说同行是冤家。两个店却关系很好。业务都蒸蒸向上。

两家店都相安无事的过了很多年。突然城东开了一家名叫params的店。这家什么都加工,不管是黄金珠宝还是黑土白云。不过由于不太专业,光顾的客人不怎么多。

(故事而已,如有雷同。纯属娱乐。)

示例代码:

1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 6 namespace RefDifferenceToOut7 {8     class Program9      {10         static void Main(string[] args)11          {12             //这里做为ref类型的参数必须初始化。ref类型参数传入未初始化变量会报错。13             string refTestStr = string.Empty;14 15             //作为out类型参数可以不初始化,因为out类型参数是在函数内部赋值。16             string outTestStr = string.Empty;17             18              Program p = new Program();19            20              Console.WriteLine("默认空值输出:");21              Console.WriteLine(p.UseRef(ref refTestStr));22              Console.WriteLine(p.UseOut(out outTestStr));23              Console.WriteLine("refTestStr:" + refTestStr);24              Console.WriteLine("outTestStr:" + outTestStr);25              Console.WriteLine("-------------------");26 27              refTestStr = "1";28              outTestStr = "2";29 30              Console.WriteLine("从新赋值:refTestStr = \"1\";outTestStr = \"2\";");31              Console.WriteLine(p.UseRef(ref refTestStr));32              Console.WriteLine(p.UseOut(out outTestStr));33              Console.WriteLine("refTestStr:" + refTestStr);34              Console.WriteLine("outTestStr:" + outTestStr);35              Console.WriteLine("-------------------");36 37 38              refTestStr = "3";39              outTestStr = "4";40              Console.WriteLine("从新赋值:refTestStr = \"3\";outTestStr = \"4\";");41              Console.WriteLine(p.UseRef(ref refTestStr));42              Console.WriteLine(p.UseOut(out outTestStr));43              Console.WriteLine("refTestStr:" + refTestStr);44              Console.WriteLine("outTestStr:" + outTestStr);45              Console.WriteLine("-------------------");46 47 48              Console.WriteLine("--------params-------");49              p.param("str_a", "2", "3", "4");50 51 52          }53 54         public string UseRef(ref string refTest)55          {56             return refTest += "rrrrrref";57          }58 59         public string UseOut(out string outTestStr)60          {61             //在这里需要给outTest从新赋值62              outTestStr = "0";63              outTestStr += "oooooout";64             return outTestStr;65          }66 67         /// <summary>68         /// params参数练习。69         /// </summary>70         /// <param name="a">同是string参数</param>71         /// <param name="list">string 类型列表参数</param>72         public void param(string a,params string[] list)73          {74              Console.WriteLine(list.ToString());75 76             int i = 0;77 78              Console.WriteLine(a);79             foreach (string s in list)80              {81                  Console.WriteLine(i++ +"_"+ s);82              }83          }84      }85 }86 

输出结果:

默认空值输出:

rrrrrref

0oooooout

refTestStr:rrrrrref

outTestStr:0oooooout

-------------------

从新赋值:refTestStr = "1";outTestStr = "2";

1rrrrrref

0oooooout

refTestStr:1rrrrrref

outTestStr:0oooooout

-------------------

从新赋值:refTestStr = "3";outTestStr = "4";

3rrrrrref

0oooooout

refTestStr:3rrrrrref

outTestStr:0oooooout

-------------------

--------params-------

System.String[]

str_a

0_2

1_3

2_4

总结:

ref和out都对函数参数采用引用传递形式——不管是值类型参数还是引用类型参数,并且定义函数和调用函数时都必须显示生命该参数为ref/out形式。两者都可以使函数传回多个结果。

两者区别:

两种参数类型的设计思想不同,ref的目的在于将值类型参数当作引用型参数传递到函数,是函数的输入参数,并且在函数内部的任何改变也都将影响函数外部该参数的值;而out的目的在于获取函数的返回值,是输出参数,由函数内部计算得到的值再回传到函数外部,因此必须在函数内部对该参数赋值,这将冲掉函数外部的任何赋值,使得函数外部赋值毫无意义。

表现为:

1、out必须在函数体内初始化,这使得在外面初始化变得没意义。也就是说,out型的参数在函数体内不能得到外面传进来的初始值。2、ref必须在函数体外初始化。3、两者在函数体内的任何修改都将影响到函数体外面。

再增加一个例子便于消化理解

        //static void SomeFunction(int[] ints, out int i)        //{        //    ints[0] = 100;        //    i = 100;        //}

        //public static int Main()        //{        //    int i = 0;        //    int[] ints = { 0, 1, 2, 4, 8 };        //    // Display the original values        //    Console.WriteLine("i = " + i);        //    Console.WriteLine("ints[0] = " + ints[0]);        //    Console.WriteLine("Calling SomeFunction...");

        //    // After this method returns, ints will be changed,        //    // but i will not        //    SomeFunction(ints,out i);        //    Console.WriteLine("i = " + i);        //    Console.WriteLine("ints[0] = " + ints[0]);        //    return 0;        //}

输出结果请自行测试

转载于:https://www.cnblogs.com/yuhuameng/p/5047416.html

.NET中,在方法参数的类型前加一个OUT是做什么用的相关推荐

  1. python函数定义中没有对参数指定类型、这说明_二级单选-函数和代码复用

    . i. .w. 1 关于递归函数的描述,以下选项中正确的是 A 函数部包含对本函数的再次调用 B 函数比较复杂 C 包含一个循环结构 D 函数名称作为返回值 正确答案: A 2 关于递归函数基例的说 ...

  2. matplotlib.pyplot中add_subplot方法参数111的含义

    >引自:http://www.codeweblog.com/matplotlib-pyplot中add_subplot方法参数111的含义/

  3. c语言可变入参中的每个参数的类型可以不同,编程入门:浅谈C语言的可变参数

    C语言中有些函数使用可变参数,比如常见的int printf( const char* format, ...),第一个参数format是固定的,其余的参数的个数和类型都不固定. C语言用va_sta ...

  4. java中的方法参数

    java中的方法参数 首先回顾一下程序设计语言中有关参数传递给方法的专业术语. 按值调用:表示方法接收的是调用者提供的值. 按引用调用:表示方法接收的是调用者提供的变量地址. java中总是采用按值调 ...

  5. html插入视频开始前图片,视频前面加图片|录制的视频前加一个图片介绍怎么弄...

    想要在录制的视频前加一个图片介绍怎么弄?嘿嘿(。・∀・)ノ゙这个就需要用到视频编辑软件啦,现在网络上视频编辑工具蛮多的,这不是又有点小纠结咧,尚在徘徊的童鞋那就随小编来看看下面这款制作视频前面加图片需 ...

  6. JQuery中$.ajax()方法参数详解(转)

    url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...

  7. java main类型_java中main方法的返回类型是?

    感谢邀请.man方法是void类型,void没有返回值类型 在java语言程序编写时都会涉及到一个main方法,它的格式为: public static void main(String[] args ...

  8. JavaScript中方法或者变量名称前加下划线的是什么意思?

    JavaScript中的方法或者变量名称前面有下划线,是做什么的? 加下划线不是js要求的,是程序员约定俗成的. 通常变量前加下划线表示"私有变量". 函数名前加下划线表示&quo ...

  9. sql中的模糊查询及字段前加N的作用

    sql语句中在字段前加N: 解决乱码问题 N表示Unicode的含义,不加N时字符串默认采用数据库所采用的定序所对应的字符集,加上N表示字符串采用Unicode ,对于数据库的默认编码方式不确定的情况 ...

最新文章

  1. 重磅!GitHub 全部源代码被泄露?
  2. Storm具体的解释(二)、成为第一Storm申请书
  3. windows 2008创建群集“xxx”时出错。由于超时时间已过,该操作返回
  4. Linux基础-2.目录文件的浏览、管理及维护
  5. 如何使用Amazon Echo控制您的Eero Wi-Fi网络
  6. android平板截屏方法,Android 各种截屏方法
  7. php实现从尾到头打印列表
  8. 设计企业网站大纲_深圳企业网站设计公司|品牌网站设计【尼高网站设计】
  9. 访问webservice,导入xml至本地数据集
  10. Python: 用matplotlib.pyplot,绘制 cos 与 sin 函数图像
  11. python中平方_python里平方
  12. 设计模式-中介者模式
  13. outlook2016 打不开超链接
  14. lisp 车位块自动编号_CAD如何生成自动编号
  15. 民生银行罗勇:金融科技下的直销银行如何创新发展
  16. 基于ESP8266的物联网智能鱼缸系统设计
  17. python栈是什么意思_Python实现的栈(Stack)
  18. android studio导入第三方库引发的问题和解决方法
  19. seaweedfs 调研
  20. SAP快速学习小结1

热门文章

  1. ACL原理与类型、基本ACL与高级ACL
  2. 浅析Vue中ref属性与getElementById的区别
  3. 计算机和cad哪个好考点,计算机考试AutoCAD考点:使用向导开始绘一张新图
  4. H265打包成RTP包详解
  5. Mac Time Machine恢复系统 Time Machine还原系统教程
  6. java知识分享篇一
  7. 12个球称三次找出异常一球的解法
  8. 炮兵阵地 (POJ-1185)(状压DP)
  9. 汽车网卡驱动之TJA1101B
  10. 数据库导入Excel时出现下标越界的解决办法