ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。
使用ref前必须对变量赋值,out不用。
out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值,ref引用的可以修改,也可以不修改。
从CLR的角度看,关键字out和关键字ref是等效的,这就是说,无论使用哪个关键字,都会生成相同的元数据和IL代码。但是,C#编译器将两个关键字区别对待,在C#中,这两个关键字的区别在于哪个方法负责初始化引用对象。如果方法的参数标记为out,那么调用者不希望在调用方法之前初始化对象,被调用的方法不能读取对象的值,而且被调用的方法必须在返回之前为对象赋值。如果方法的参数标记为ref,那么调用者必须在调用方法之前首先初始化参数的值,被调用的方法可以读取参数或为参数赋值。
----cite a simple example
using System; class TestApp { static void outTest(out int x, out int y) {//离开这个函数前,必须对x和y赋值,否则会报错。 //y = x; //上面这行会报错,因为使用了out后,x和y都清空了,需要重新赋值,即使调用函数前赋过值也不行 x = 1; y = 2; } static void refTest(ref int x, ref int y) { x = 1; y = x; } public static void Main() { //out test int a,b; //out使用前,变量可以不赋值 outTest(out a, out b); Console.WriteLine("a={0};b={1}",a,b); int c=11,d=22; outTest(out c, out d); Console.WriteLine("c={0};d={1}",c,d); //ref test int m,n; //refTest(ref m, ref n); //上面这行会出错,ref使用前,变量必须赋值 int o=11,p=22; refTest(ref o, ref p); Console.WriteLine("o={0};p={1}",o,p); } }
namespace 方法参数 { /// <summary> /// 参数测试 /// </summary> class Program { static void Main(string[] args) { //输出参数 Point p = new Point(10, 12); int x, y;//输出参数不需要赋初值//与引用类型相似,输出参数也不开辟新的内存区域, 但在调用方法前无需对变量进行初始化。 p.GetPoint(out x, out y); Console.WriteLine("p({0},{1})", x, y); //引用参数 Point2 p1 = new Point2(12, 23); int x1 = 0, y1 = 0;//引用参数一定要赋初值 p1.GetPoint(ref x1, ref y1); Console.WriteLine("p1({0},{1})", x1, y1); // 参数数组 int[] a = { 1, 2, 3, 4, 5 }; Array.F(a); Array.F(10, 20, 30, 60, 50);//F(new int[] {10, 20, 30, 60, 50}) Array.F(); Console.ReadLine(); } } /// <summary> /// 输出参数可返回多个值 /// </summary> class Point { int X, Y; public Point(int x, int y) { this.X = x; this.Y = y; } public void GetPoint(out int x, out int y)//输出参数用于传递方法返回的数据。out修饰符后应跟与形参类型相同的类型申明。在方法返回后,传递的变量被认为经过了初始化。 { y = this.Y; x = this.X; } } /// <summary> /// 引用参数 /// </summary> class Point2 { int X, Y; public Point2(int x, int y) { this.X = x; this.Y = y; } public void GetPoint(ref int x, ref int y) { y = this.Y; x = this.X; } } /// <summary> /// 参数数组 /// </summary> class Array { public static void F(params int[] args) { Console.WriteLine("数组长度为:{0}", args.Length); foreach (int i in args) { Console.WriteLine("{0}", i); } Console.WriteLine(); } } }
发表评论
-
C# 实现将文件夹分卷压缩
2015-04-17 17:01 1149http://bbs.csdn.net/topics/3907 ... -
C#发送邮件
2015-04-17 15:58 652public class SendEmailHelper ... -
C# xml文件读取
2015-02-11 16:08 585看附件................ -
什么时候该用委托,为什么要用委托,委托有什么好处....
2015-01-29 16:56 788http://www.cnblogs.com/superpce ... -
C#中动态加载和卸载DLL
2015-01-26 14:02 1384在C++中加载和卸载DLL是一件很容易的事,LoadLibra ... -
转:c#常用的18种设计模式
2015-01-21 08:16 730http://blog.jobbole.com/78130/ -
C#委托的介绍(delegate、Action、Func、predicate)
2015-01-09 17:26 1057http://www.cnblogs.com/akwwl/p/ ... -
接口和抽象类有什么区别 .
2014-12-22 16:35 591接口和抽象类有什么区别 你选择使用接口和抽象类的依据是什么 ... -
C#一个简单写日志文件的类
2014-12-11 09:57 1072/// <summary> /// L ... -
Linq初级班 Linq to DataSet体验(单表、多表联合查询JOIN语法)
2014-12-10 14:34 330http://www.cnblogs.com/huangcon ... -
C#泛型详解
2014-11-29 11:31 450我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处 ... -
线程同步与异步的区别
2014-11-26 09:12 848异步处理就是按照不同步的程序处理问题。异步处理与同步处理是对立 ... -
应用C#和SQLCLR编写SQL Server用户定义函数 .
2013-10-09 17:07 451http://blog.csdn.net/zhzuo/arti ... -
log4Net简介
2013-06-30 11:32 544使用log4Net可以将系统听日志保存到DB、日志文件、邮箱中 ... -
DataGridView历史记录的前进与后退操作
2013-06-23 11:13 1078此功能介绍:DataGridView频繁查询数据时,可以将每次 ... -
c# 对INI配置文件的读取操作
2013-06-17 10:51 654此种方法只对如下格式的INI文件起作用 server=loca ... -
对DataGridView控件的扩展开发
2013-06-15 21:47 2340首先在项目中引用 ... -
对集合控件(ListBox,ComboBox,TreeView,RichTextBox,DataGridView)的查找、替换操作控件
2013-06-15 09:39 1524一、程序入口: using System; using ... -
C#对文件、文件夹操作公用组件
2013-06-11 09:46 943namespace HR.Class.IO { / ... -
TreeView控件操作开发篇之(五)
2013-06-09 00:09 790#region 加载文件夹及文件到树 ...
相关推荐
本文主要介绍了关于C#参数数组、引用参数和输出参数的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 参数数组 在C#中,可以为函数指定一个不定长的参数,这个参数是函数定义中的最后一...
C#方法参数的一个简单例子,具体用了值参数、引用型参数 、输出参数、数组型参数做例子,适合初学者。
主要介绍了C#基础语法:方法参数详解,本文讲解了值参数、引用参数、输出参数、参数数组等参数类型,并分别给出代码实例,需要的朋友可以参考下
和 C++ 有所区别的是,C# 中没有单独的声明(头)和实现(CPP)文件。所有代码(类声明和实现)都放在扩展名为 cs 的单一文件中。 看看 C# 中的 Hello World 程序。 复制内容到剪贴板 代码: using System; ...
代码如下:/给三个整数从小到大排序并求和...熟悉引用参数和输出参数的使用。using System;class Class1 { //x,y,z是形参,按值传递 static void Sort(int x, int y, int z) { int temp=0; if(x>y) { temp=x; x
7.2.3 输出类型参数传递 7.2.4 数组类型参数传递 7.3 静态方法 7.4 方法的重载 7.5 外部方法 7.6 操作符重载 7.6.1 一元操作符的重载 7.6.2 二元操作符的重载 7.7 本章小结 7.8 上机练习 7.9 习题 第8章 继承与多态...
4.5.3 输出参数 4.5.4 参数数组 4.6 递归 4.7 方法重载 4.8 可选参数 4.9 用异常实现基本错误处理 4.9.1 捕捉错误 4.9.2 使用throw语句报告错误 4.10 小结 第5章 类 5.1 类的定义和实例化 5.2 实例字段 ...
12、该程序显示了各种值参数、引用参数和输出参数的初始化和调用结果比较。 13、该程序显示了c#中指针的用法, 14、该程序显示了打开文件并写入文字,若该文件不存在,就显示该完全路线。 15、该程序是一个输入姓名...
4.5.2 引用参数(ref) 117 4.5.3 输出参数(out) 118 4.5.4 参数数组 120 4.6 递归 122 4.7 方法重载 124 4.8 可选参数 126 4.9 用异常实现基本错误处理 129 4.9.1 捕捉错误 130 4.9.2...
提供对C#代码生成器和代码编译器的实例的访问。如果要动态生成VB代码,可以使用VBCodeProvider。 CreateCompiler():获取编译器的实例。 二、ICodeCompiler 定义用于调用源代码编译的接口或使用指定编译器的CodeDOM...
4.4.3 输出参数(out参数) 61 4.5 特殊的方法 62 4.5.1 Main()方法 62 4.5.2 构造函数 62 4.5.3 带参数的构造函数 63 4.5.4 析构函数 64 4.6 小结 65 4.7 习题 65 第5章 流程控制 69 5.1 选择执行——条件 70 ...
CS_02输入和输出 CS_03异常捕获 CS_04字符串拼装 CS_05枚举 CS_06数组 CS_07二维数组 CS_08交错数组 CS_09值类型和引用类型 CS_10特殊的引用类型string CS_11函数 CS_12学习ref和out CS_13变长参数和参数默认值 CS_...
在 C 或 C 中与委托最接近的是函数指针,但函数指针只能引用静态函数,而委托可以同时引用静态方法和实例方法。在后一种情况中,委托不仅存储对方法入口点的引用,还存储对调用其方法的对象的引用。与 C 函数指针...
11.2 方法中的参数.125 11.3 静态和非静态的方法.129 11.4 方法的重载.130 11.5 操作符重载.134 11.6 小 结.137 第十二章 域 和 属 性 .139 12.1 域 .139 12.2 属 性 .143 12.3 小 结 .146 第十三...
1.3 类型和变量 3 1.4 表达式 6 1.5 语句 8 1.6 类和对象 12 1.6.1 成员 12 1.6.2 可访问性 13 1.6.3 类型参数 13 1.6.4 基类 14 1.6.5 字段 14 1.6.6 方法 15 1.6.6.1 参数 15 1.6.6.2 方法体和局部变量 17 1.6.6.3...
ref 通常我们向方法中传递的是值。方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被...当我们调用一个含有引用参数的方法时,方法中的参数将指向被传递给方法的相应变量,因此,我
实例011 使用值类型和引用类型输出不同的字段 实例012 判断当前系统日期是星期几 实例013 定义局部变量输出不同的字段 实例014 定义循环内部变量并输出变量的值 实例015 定义常量计算圆的周长 实例016 使用“+”编写...
2.4.5 运算符和标点符号... 42 2.5 预处理指令 42 2.5.1 条件编译符号... 43 2.5.2 预处理表达式... 43 2.5.3 声明指令... 44 2.5.4 条件编译指令... 45 2.5.5 诊断指令... 47 2.5.6 区域指令... 47 2.5.7 ...