C#之out和ref区别

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

时间: 2024-12-24 08:32:03

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

out ref 区别

在C#这门高级语言中,你是否注意过ref与out的用法?你是否为在调用方法时需要多个返回值呢?不用急,接下来,我们去一起去研究一下这个问题... 其实呢,C#语言中,参数的传递一共有两种方法,值传递和引用传递. 而ref与out这两种方式都属于引用传递,只是他们的用法稍有不同. ref的特点是有进有出,即在传递参数之前就已经对它进行赋值,在传入方法体时,是将该数的地址传了进来,如果对其进行相应的赋值操作,直接改的是地址里的值,所以,当该方法执行完,该数的值也就跟着改变了. 代码如下: stati

C#中out与ref区别

一.ref(参考)与out区别 1.out(只出不进) 将方法中的参数传递出去,在方法中将该参数传递出去之前需要在该方法起始赋初值:在方法外传递的该参数可以不用赋值: 简单理解就是:将一个东西抛出去之前必须对此东西进行修改,否则就不用抛出去,修改时的动作必须发生在方法的起始. 2.ref(有进有出)在方法外引用参数,并可在方法中进行修改,修改后该参数将被更新.在方法外引用该参数时需要在方法外赋初值. 简单理解就是:拿别人的东西之前需要请人家做个标记,然后把东西拿来进行修改,修改后该东西就变成了新

out ref区别

1.使用ref型参数时,传入的参数必须先被初始化.对out而言,必须在方法中对其完成初始化. 2.out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候. 两者都是按地址传递的,使用后都将改变原来的数值.类似C++的指针(*和#) ref可以把参数的数值传递进函数,out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次.这个就是两个的区别,或者说就像有的网友说的,ref是有进有出,out是只

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

//out传参前需要对参数进行赋值处理,ref则不需要.//out.ref 传参都可以对值进行改变 1 static void Main(string[] args) 2 { 3 int I = 10; 4 //int J = 10; 5 //int I; 6 int J; 7 //int[] k=new int[5]{1,2,3,4,5}; 8 int[] k = new int[5]; 9 //int[] l = new int[5]{1,2,3,4,5}; 10 int[] l = new

SQL业务审核与优化

审核   什么是业务审核 类似与code review 评审业务Schema和SQL设计 偏重关注性能 是业务优化的主要入口之一 审核提前发现问题,进行优化 上线后通过监控或巡检发现问题,进行优化 Schema设计审核 表和字段命名是否合规 字段类型,长度设计是否适当 表关联关系是否合理 主键,更新时间保留字段等是否符合要求 约束,默认值等配置是否恰当 了解业务,表数据量,增长模式 数据访问模式,均衡度 根据业务需求,表是否需要分区,是否有数据什么周期 SQL语句审核 SQL语句的执行频率 表上

设计模式学习第一天:23种设计模式(全)

C#常见的设计模式 一.概要: 模式分为三种,设计模式.体系结构模式与惯用法.其中惯用法是一种语言紧密相关的模式,例如,定界加锁模式其实是一种惯用法. 在C#项目开发过程中,很多情况下您已经使用了某些模式,但或许您并不知道自己所使用的这种解决方案是一种已经被总结归纳的模式. 工厂.策略.桥接.模板方法.代理等等23种Gof经典模式是属于设计模式,设计模式的粒度相对较小,基本上用于提高模块内部的可扩展性和可维护性需求 三层.MVC.IoC/DI等属于体系结构模式,粒度比设计模式大,它是从项目的整体

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

本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 本篇是根据官网中的每个一点来翻译.举例.验证的:英语不好,所以有些话语未必准确,请自行查看官网,若有些点下面没有例子的是因为当时一下子没有想出那么多来,如果大家有遇上好的例子,欢迎在下面留言我持续更新 查看执行计划的关键EXPLAIN 版本MYSQL5.6,用到的库是官网例子sakila,自行下载导入 由于要把每个点都翻译出来,还需要举例,所以需要一定的时间

MySQL索引管理及执行计划

第1章 索引介绍: 索引是对数据库表中一列或者多了的值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息,如果想按特定职员的姓名来查找,则与他在表中搜索所有的行相比,索引有助于更快的获取信息 索引的一个主要目的就是加快检索表中的数据的方法,既能协助信息搜索者尽快找到符合限制条件的记录ID的辅助数据结构 1.1 索引的类型介绍: btree:B+树索引    最为常用 hash:hash索引 fulltest:全文索引 rtree:r数索引 第2章 索引管理 2.1 B树索引的分类: 主

关于Explain

最近在对sql进行性能优化因此对explain相关的知识进行一个简单的整理归纳. EXPLAIN: 为SELECT语句中使用到的每个表返回一条 SELECT 执行的详细信息:按照MySQL在处理语句时读取它们的顺序列出这些表. 命令输出格式 id = 1 select_type = SIMPLE table = clazz partitions = type = const possible_keys = PRIMARY key = PRIMARY key_len = 98 ref = cons