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是有进有出,

C#之out和ref区别的更多相关文章

  1. out ref区别

    1.使用ref型参数时,传入的参数必须先被初始化.对out而言,必须在方法中对其完成初始化. 2.out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候. ...

  2. C#中out与ref区别

    一.ref(参考)与out区别 1.out(只出不进) 将方法中的参数传递出去,在方法中将该参数传递出去之前需要在该方法起始赋初值:在方法外传递的该参数可以不用赋值: 简单理解就是:将一个东西抛出去之 ...

  3. C# Out和Ref区别

    rel是有进有出,out是只出不进 ref 要求参数在传递给函数前要初始化,out则不需要

  4. C# 中传参中的OUT 和 ref 区别 笔记

    //out传参前需要对参数进行赋值处理,ref则不需要.//out.ref 传参都可以对值进行改变 1 static void Main(string[] args) { ; //int J = 10 ...

  5. C# out 和 ref 区别

    C#里面的 out 和ref参数时常会用到 记录一下: public void Start() { //outSum没必要赋值,赋值了也完全没用. //如果AddByOut函数内部直接使用out对应的 ...

  6. MYSQL EXPLAIN执行计划命令详解(支持更新中)

    本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 本篇是根据官网中的每个一点来翻译.举例.验证的:英语不好,所 ...

  7. MySQL索引管理

    一.索引介绍 1.什么是索引 1.索引好比一本书的目录,它能让你更快的找到自己想要的内容. 2.让获取的数据更有目的性,从而提高数据库索引数据的性能. 2.索引类型介绍 1.BTREE:B+树索引 2 ...

  8. .Net23种设计模式

    C#常见的设计模式 一.概要: 模式分为三种,设计模式.体系结构模式与惯用法.其中惯用法是一种语言紧密相关的模式,例如,定界加锁模式其实是一种惯用法. 在C#项目开发过程中,很多情况下您已经使用了某些 ...

  9. mysql 开发进阶篇系列 2 SQL优化(explain分析)

    接着上一篇sql优化来说 1. 定位执行效率较低的sql 语句 通过两种方式可以定位出效率较低的sql 语句. (1) 通过上篇讲的慢日志定位,在mysqld里写一个包含所有执行时间超过 long_q ...

随机推荐

  1. [ CCO 2015 ] Artskjid

    \(\\\) \(Description\) \(N\)个点\(M\)条边的有向图,求从\(0\)号节点出发,\(N-1\)号节点结束,且图中每个点至多经过一次的最长路. \(N\in[2,18]\) ...

  2. Spark学习之RDD编程(2)

    Spark学习之RDD编程(2) 1. Spark中的RDD是一个不可变的分布式对象集合. 2. 在Spark中数据的操作不外乎创建RDD.转化已有的RDD以及调用RDD操作进行求值. 3. 创建RD ...

  3. 打开VMware Workstation,虚拟机不见了

    1 打开VM,发现虚拟机不见了 如图所示: 此时先别急着再次安装虚拟机. 2 先打开设备上所有已安装过的虚拟机,看你需要的还在不在 3 总结 如果打开后发现你要的虚拟机还存在,直接打开就好.否则,就得 ...

  4. TOP5_3:定制简单的进度条

    结构: Activity: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xm ...

  5. binlog_format不同模式下,对mysqlbinlog恢复的影响

      binlog_format='mixed' (root)[(none)]>use test; Reading table information for completion of tabl ...

  6. jmeter的JDBC Request接口测试

    Jmeter操作Mysql 测试计划添加.jar包 mysql-connector-java-5.1.7-bin.jar用于使Jmeter可以读取Mysql: 线程组添加 JDBC Connectio ...

  7. 梦想CAD控件com接口扩展数据

    随着CAD应用软件的飞速发展,经常需要保存一些与图形可视性无关的数据,即非图形参数.例如在绘制化验样图中包含品位数据.MxCAD定义了一类参数——实体扩展数据.扩展数据与实体的可视性无关,而是用户根据 ...

  8. linux ssh 利用scp传输文件

    使用方式如下: 1.上传本地文件到服务器 scp /path/filename username@servername:/path/ 例如scp /var/www/test.php root@192. ...

  9. gym101673G. A Question of Ingestion (DP)

    题意:有最多100天 每天有一个食物量 你一开始有一个最大胃口表示你最开始能吃多少食物 如果你昨天吃了 那么今天的胃口为昨天的2/3 如果你前天吃了 昨天没吃 那么你的胃口可以恢复到前天的情况 如果你 ...

  10. Leetcode 498:对角线遍历Diagonal Traverse(python3、java)

    对角线遍历 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. Given a matrix of M x N elemen ...