关于c#中”ref”和”out”关键字的一些理解
一. 综述(本文内容大部分来自网络,经本人整理而成,仅供学习参考,不免理解错误,欢迎批评指正)
- 在c#中,方法的参数传递有四种类型:
(1) 传值参数(by value)
传值参数无需额外的修饰符。传值参数在方法调用过程中,如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此而改变,而是保持原来传入的值。实际
上,传值参数传递的是调用参数的一份拷贝,因此在调用方法的过程中,即使改变了参数的值,也不会影响到实际传入的参数值,详见例程:
(2) 传址参数(by reference)
传址参数需要修饰符ref(关键字),传址参数如果在方法的调用过程中改变了参数的值,那么传入方法的参数在调用完成以后也随之改变。传址参数传递的是调用参数的 内存地址,该参数在方法内外指向同一个存储位置。因此,在调用方法过程中如果改变了参数的值,呢么实际出入的参数值也会随之改变,详见例程:
- 方法参数上的ref方法参数关键字,使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
- 若要使用ref参数,必须将参数作为ref参数显示传递到方法;
- 传递到ref参数的参数必须先初始化;
- 属性不是变量,不能作为ref参数传递;
(3) 输出参数(by output)
输出参数需要修饰符out(关键字)。
- 方法参数上的out方法参数关键字,使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
- 当希望方法返回多个值时,声明out方法非常有用。使用out参数的方法仍然可以返回一个值,一个方法可以有一个以上的out参数。
- 在使用out参数前,不必初始化作为out参数传递的变量,然而必须在方法返回之前为out参数赋值。
- 属性不是变量,不能做为out参数传递。
(4)数组参数(by array)
数组参数需要修饰符params。
2. ref关键字与out关键字的区别
在c#中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持更改,若要通过引用传递参数,可使用ref和out关键字。ref和 out都可以提供相似的功效,其作用也很想c中的指针变量。它们的区别是:
(1)使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
(2)使用ref和out时,在方法的参数和执行方法时,都要加ref或out关键字,以满足匹配。
(3)out适合用在需要return多个返回值的地方,而ref则用在需要被调用的方法修改修改调用者的引用的时候。
二. 例程
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections; namespace ConsoleApplication5
{
class Program
{
//使用普同传值参数的函数
static void ValueTest(int x, int y)
{
x = ;
y = ;
} //使用ref传址参数的函数
static void RefTest(ref int x, ref int y)
{
x = ;
y = x;
} //使用out输出参数的函数
static void OutTest(out int x, out int y)
{
//离开这个函数前,必须对x和y赋值,否则会报错
//y = x;
//上面这行会报错,因为使用了out后,x和y都清空了,需要重新赋值,即使调用函数前赋过值也不行
x = ;
y = ;
} static void Main(string[] args)
{
/************测试普通的传值参数*******************/
int a = ;
int b = ;
ValueTest(a, b);//调用该函数不会改变变量a,b的值
Console.WriteLine("a={0};b={1}", a, b);//此处输出a,b的值分别为4,7 /************测试“ref”*******************/
//int m;
//int n;
//RefTest(ref m, ref n);
//上面这行会出错,ref使用前,变量m,n必须赋值 int o = ;
int p = ;
RefTest(ref o, ref p);
Console.WriteLine("m={0};n={1}", o, p);//o和p的值将会变为RefTest函数中所改变的值,此处输出o为1,,p为1 /************测试普通的传值参数*******************/
//使用out参数时,可以先不对变量c,d进行初始化
int c;
int d;
OutTest(out c, out d);//c和d的值将会变为OutTest函数中所改变的值,此处输出c为1,,d为2
Console.WriteLine("c={0};d={1}", c, d);
Console.ReadLine();
}
}
}
关于c#中”ref”和”out”关键字的一些理解的更多相关文章
- 为什么C#中ref和out 关键字 ?
需求假设:现需要通过一个叫Swap的方法交换a,b两个变量的值.交换前a=1,b=2,断言:交换后a=2,b=1. 现编码如下: class Program { static void ...
- c#中ref和out 关键字
问题:为什么c#中要有ref和out?(而java中没有)需求假设:现需要通过一个叫Swap的方法交换a,b两个变量的值.交换前a=1,b=2,断言:交换后a=2,b=1. 现编码如下: class ...
- C#中ref和out关键字的应用以及区别
首先:两者都是按地址传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所 ...
- C# 中ref与out关键字区别
ref 关键字通过引用传递的参数的内存地址,而不是值.简单点说就是在方法中对参数的任何改变都会改变调用方的基础参数中.代码举例: class RefExample { static void Meth ...
- C#中ref和out关键字的应用以及区别(参数修饰符)
ref ref的定义 ref是reference的缩写,通过引用来传递参数的地址,ref基本上是服务于值类型的 ref的使用 //不使用 ref; void Method(int myRefInt) ...
- C#中await和async关键字的简单理解
C# 5.0之后,为了简化异步编程,引入了异步函数的概念,也就是方法标记async,然后可以使用await表达式来等待异步操作返回. await关键字看起来是一个阻塞线程的调用,但是实际上执行到awa ...
- C#中ref关键字的用法总结
ref表示引用的意思,C#中它有多种用法,这里简单总结一下: 1.按引用传递参数 具体可见:C#中的值传递与引用传递(in.out.ref) 2.引用局部变量 引用局部变量指的是在变量声明时使用ref ...
- C#中REF和OUT的区别
在C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值,并保持该更改.若要通过引用传递参数, 可使用ref或out关键字.ref和out这两个关键字都能够提供相似的功 ...
- C#中ref和out的使用与区别
C#中ref关键字和out关键字所实现的功能差不多,都是指定一个形参按照引用传递而不是实参的副本传递.但是二者适用场景还是有些区别的:out适合用在需要retrun多个返回值的地方,而ref则适合用在 ...
随机推荐
- java并发编程实战:第二章----线程安全性
一个对象是否需要是线程安全的取决于它是否被多个线程访问. 当多个线程访问同一个可变状态量时如果没有使用正确的同步规则,就有可能出错.解决办法: 不在线程之间共享该变量 将状态变量修改为不可变的 在访问 ...
- 使用MATLAB一键制作mif文件
本文档主要讲解实现一个16384(2^14)点的14位正弦波数据mif格式文件的生成,使用此文件,我们便可以在FPGA上基于直接数字合成(DDS)原理生成标准的正弦波,即实现信号发生器的功能.关于DD ...
- 国际时区 TimeZone ID列表
public static void main(String[] args) { Calendar c = new GregorianCalendar(); c.setTime(new Date()) ...
- java分页实例Demo
前两天测试过的一个分页的demo,在网上看到的,挺好的,就写了下来. 分页也是web里面必须的,有使用的价值. demo文件打包上传了,链接:http://pan.baidu.com/s/1o6sME ...
- Cockroachdb 四、用户管理及授权
四 用户管理及授权 用户管理 简介# Create a user:cockroach user set <username> <flags> # List all users: ...
- [Erlang22]如何按规则位数输出数字
需求:把一个数字指定长度输出 例如: 1 00000001 12 00000012 1203 00001203 123456789 123456789 1234567 01234567 方法一: ...
- javascript做的一个根据table中某个td的值为日期时的倒计时
JavaScript代码: <script> window.onload = window.onload = function () { getTdValue(); } //根据传过来的天 ...
- XSS结合JSONP获取网站访客社交账号信息
我在本地环境搭建了一个WordPress网站,并在该网站中植入JavaScript文件.如果访客在浏览网站时登录了百度账号,该js文件能够利用JSONP获取网站访客的百度账号信息. 具体情况如下: 1 ...
- python中的列表和元组
1. 什么是列表 定义: 能装对象的对象 在python中使用[]来描述列表, 内部元素用逗号隔开. 对数据类型没有要求,列表存在索引和切片. 和字符串是一样的. 2.相关的增删改查操作 切片 列表和 ...
- Delphi XE7编译安卓程序出错了
昨天编译一个先前可以正常运行的程序,忽然就不能编译了,总是提示这个错误,经过一番排查,终于搞定了,原因:删除了安卓lib引用的JAR和单元文件.如果你也出现这个问题,打开工程全部目录,看一下是否有打小 ...