out与ref的区别总结:
1.两者都是通过引用来传递。
2.两者都按地址传递的,使用后都将改变原来参数的数值。
3.属性不是变量,因此不能作为 out或ref 参数传递。
4.若要使用 ref 或 out,方法定义和调用方法都必须显式使用 out、ref 关键字。
5.rel可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。或者说,rel是有进有出,out是只出不进
6.尽管 ref 和 out 在运行时的处理方式不同,但在编译时的处理方式相同。
—6-1.因此,如果一个方法采用 ref 参数(例:Method(ref int i)),而另一个方法采用 out 参数(例:Method(out int i)),则无法重载这两个方法,因为从编译的角度来看,以上两个方法是完全相同的,因此将不会编译方法内的代码
—6-2.但是,如果一个方法采用 ref 或 out 参数(例如:Method(ref/out int i))),而另一个方法不采用这两个参数Method(int i)),则可以进行重载
7.实用场合:out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。

代码如下:

 1         public static void Main(string[] args)
2 {
3 //使用out
4 Console.WriteLine("-----------------------------使用OUT的方法-----------------------------");
5 Console.WriteLine("-----------------调用Out方法前参数没赋值-----------------");
6 string outName;
7 string outSchool;
8 int outGrad;
9 outMethod(out outName, out outGrad, out outSchool);
10 Console.WriteLine("学生" + outName + "是:" + outSchool + outGrad + "级学生");
11
12 Console.WriteLine("-----------------调用Out方法前参数赋值了-----------------");
13 string outNameValue = "李XX";
14 string outSchoolValue = "河南大学";
15 int outGradValue = 2011;
16 outMethod(out outNameValue, out outGradValue, out outSchoolValue);
17 Console.WriteLine("学生" + outNameValue + "是:" + outSchoolValue + outGradValue + "级学生");
18
19
20
21 //使用ref:
22 Console.WriteLine("-----------------------------使用REF的方法-----------------------------");
23 string refName = "李XX";
24 string refSchool = "河南大学";
25 int refGrad = 2011;
26 Console.WriteLine("-----------------refMethod方法里没赋值-----------------");
27 refMethod(ref refName, ref refGrad, ref refSchool);
28 Console.WriteLine("学生" + refName + "是:" + refSchool + refGrad + "级学生");
29 Console.WriteLine("-----------------refMethod方法里赋值了-----------------");
30 refMethodValue(ref refName, ref refGrad, ref refSchool);
31 Console.WriteLine("学生" + refName + "是:" + refSchool + refGrad + "级学生");
32
33 Console.ReadLine();
34 }
35
36
37
38 //outMethod
39 //out方法输出参数特征:
40 //1.不在栈中为形参分配新的内存。
41 //2.形参的名称相当于实参变量的别名,引用与实参相同的内存位置。
42 //3.既然形参和实参引用相同的内存位置,则在方法执行期间,形参所做的任何改变在方法完成之后通过实参变量都是可见的。
43 private static void outMethod(out string name, out int grad, out string school)
44 {
45 name = "王XX";
46 grad = 2009;
47 school = "郑州大学";
48 }
49
50 //refMethod
51 //ref方法输出参数特征:
52 //1.不在栈中为形参分配新的内存。
53 //2.形参的名称相当于实参变量的别名,引用与实参相同的内存位置。
54 //3.既然形参和实参引用相同的内存位置,则在方法执行期间,形参所做的任何改变在方法完成之后通过实参变量都是可见的。
55 private static void refMethod(ref string name, ref int grad, ref string school)
56 {
57
58 }
59 private static void refMethodValue(ref string name, ref int grad, ref string school)
60 {
61 name = "王XX";
62 grad = 2009;
63 school = "郑州大学";
64 }

以上代码的输出结果:

由以上的输出结果可以看出:

1、在调用方法outMethod之前变量赋值不赋值没有任何意义,因为out是要把参数清空的,其参数赋值只要在方法内部进行就可以了;即out是只出不进

2、在调用refMethod之前必须给变量赋值,然而在refMethod方法内部参数赋值不赋值均可以,如方法内部重新赋值了则修改其值,如方法内部没重新赋值则不修改其值;rel是有进有出,

最新文章

  1. http学习笔记(四)——HTTP报文
  2. Beta版本冲刺———第六天
  3. 浅谈Eclipse寻找JVM(JRE)的顺序机制(转)
  4. bzoj 1054: [HAOI2008]移动玩具 bfs
  5. FineUI疑难杂症
  6. HashMap和HashTable 学习
  7. USACO Preface Numbering 构造
  8. Python爬虫2----------运用代理访问
  9. 基于ESXI6.5的服务器基本配置(HP DL388 Gen 9)
  10. 查看CentOS版本信息
  11. Scaffold-DbContext 命令参数
  12. 大叔学ML第四:线性回归正则化
  13. #WEB安全基础 : HTML/CSS | 0x3文件夹管理网站
  14. c++ 入门之对象指针
  15. TRIO-basic指令--MOVEMODIFY
  16. 微软BI 之SSIS 系列 - 通过 ROW_NUMBER 或 Script Component 为数据流输出添加行号的方法
  17. Python:Hello World级别的SimpleDb
  18. oracle出现无法修改的异常记录
  19. TED #05# How we can face the future without fear, together
  20. [POI2007]EGZ-Driving Exam

热门文章

  1. GDB 使用小结
  2. html与html5 总结
  3. 推荐一些相见恨晚的 Python 库 「一」
  4. Spring+Spring MVC+Hibernate增查(使用注解)
  5. struts2特殊符号替换
  6. iOS,Core Animation--负责视图的复合功能
  7. java_IO_装饰器
  8. 在WEB项目中调用QQ通讯组件打开QQ聊天界面
  9. 牛客多校Round 6
  10. Linux kernel-汇编基础