c#中的out和ref
不知大家有没有遇到过需要一个函数返回多个值的情况。
当写代码要返回多个值的时候,当然可以返回一个数组来实现,但如果遇到需要返回的多个值的类型不同呢?这个时候怎么办?
c#中,out关键字和ref关键字就起作用了。(且out更适合用到多返回值的地方)
一个函数中,使用out或ref作为形参前的关键字,那么在函数体中只要修改过这个形参,之前调用这个函数时赋给对应形参的实参的值也会修改。这是怎么实现的呢?它的机理就是,使用out 和ref修饰的形参是引用类型,而不是值类型,也就是说它们所存储的信息是地址,而不是值类型。
既然都是存储的地址,那么它们有什么区别呢?
我整理了一下,主要有以下几点区别:
1,ref 要求变量必须在传递之前进行初始化(赋初值),但调用时可以对它什么也不做;而out 在调用*之前*,并不需要为这一形参的变量赋予初始值。
2,out 只能用来将值从方法中传出。不管外界是什么值,使用了out是要把参数清空的,然后函数体中必须对其赋值。也就是说,在调用*之时*的函数体内部必须对out修饰的变量赋值。
简单说就是ref有进有出(或无出),out无进有出。
示例代码如下,
class Program
{ static void Main(string[] args)
{
Program pg = new Program();
int x =;
int y = ;
pg.getnull(ref x, ref y);//这里x,y必须为已经赋过初值的,否则编译不通过
Console.WriteLine("x=" + x + ",y=" + y);//输出为:x=0,y=0,原值没有改变,因为是空方法 pg.GetValue(ref x, ref y);//这里x,y已经赋过初值的
Console.WriteLine("x=" + x + ",y=" + y);//输出为:x=1,y=2
Console.ReadLine(); }
public void getnull(ref int x, ref int y)
{ }
public void GetValue(ref int x, ref int y)
{
x++;
y = y + ;
} }
class Program
{ static void Main(string[] args)
{
Program pg = new Program();
int x =;
int y = ;
pg.getnull(out x,out y);//这里x,y不需要赋初值,赋了也没关系,但会清零;注意:** 调用函数时必须写关键字out ** 因为参数与关键字是一起传递的
Console.WriteLine("x=" + x + ",y=" + y);//输出为:x=3,y=3,原值没有改变,因为是空方法 pg.GetValue(out x, out y);//这里x,y已经赋过初值的
Console.WriteLine("x=" + x + ",y=" + y);//输出为:x=12,y=21
Console.ReadLine(); } public void getnull(out int x, out int y)//如果函数体中没有给x,y赋初值(即下面函数体为空),那么编辑器会提示“控制离开当前方法之前必须对out参数x赋初值”,编译不通过
{
x = ;//这里我们赋值,不赋值编译不通过
y = ;
}
public void GetValue(out int x, out int y)
{
//x++;//同样如果这么写会提示“使用了未赋值的out参数 x”,所以不可以这么直接 x++
//y = y + 2;//同上 //我们改为下边写法,就可以编译通过
x = ;
y = ;
//这个函数和getnull的功能就完全相同了
}
}
c#中的out和ref的更多相关文章
- c#中关键词out和ref的区别
c#中关键词out和ref用来表明以传引用的方式传递参数. 区别如下: 如果方法的参数用out标记,表示方法被调用前不需初始化参数,方法内不能读取此参数的值,在方法返回前必须向此参数写入值: 如果方法 ...
- c#.net中参数修饰符ref,out ,params解析
params ============================================================================================= ...
- C#中的Params、ref、out的区别
C# Params params params 关键字可以指定在参数数目可变处采用参数的方法参数. 在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params ...
- c#中的Out, params,ref 细说并沉淀
1. Out,params,ref之前先记录平时用的最多的按值传递参数的情况,当然默认情况下参数传入函数的默认行为也是按值传递的. 1: //默认情况下参数会按照值传递 2: static int a ...
- C#中的out参数/ref参数/params可变参数
out参数: out关键字 通过引用来传递参数,在定义方法和调用方法的时候都必须使用out关键字 简单来讲out可以用来返回多个参数类型. static void Main(string[] args ...
- C#中的out、ref、params详解
out参数: 如果你在一个方法中,返回多个相同类型的值的时候,可以考虑返回一个数组.但是,如果返回多个不同类型的值的时候,返回数组就不行了,那么这个时候,我们可以考虑使用out参数.out参数就侧重于 ...
- C# 中out 参数 和 ref参数的区别
C#中共有4种参数类型,分别是 传值(by value), 传址 (by reference), 输出参数 (by output), 数组参数 (by array) by value => 传值 ...
- C# 中传参中的OUT 和 ref 区别 笔记
//out传参前需要对参数进行赋值处理,ref则不需要.//out.ref 传参都可以对值进行改变 1 static void Main(string[] args) { ; //int J = 10 ...
- C#中关键字ref与out的区别【转】
在C#中,ref与out是很特殊的两个关键字.使用它们,可以使参数按照引用来传递.总的来说,通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢 ...
随机推荐
- ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL
ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL 引言--- 在现今搜索引擎制霸天下的时代,我们不得不做一些东西来讨好爬虫,进而提示网站的排名来博得一个看得过去的流 ...
- Python 爬虫实战—盘搜搜
近期公司给了个任务:根据关键搜索百度网盘共享文件并下载. 琢磨了几天写下了一段简单的demo代码,后期优化没有处理. 主要的思路:(1)根据关键字爬取盘搜搜的相关信息 (2)解析并获取盘搜搜跳转到百度 ...
- C# null,string.Empty,"",DBNull 的区别
[null] null 在C# 中是一个关键字,表示不引用任何对象的空引用的文字值. null 是引用类型变量的默认值. 普通值类型不能为 null. null 在 VS 中定位不出来具体是怎么定义的 ...
- 关于Select选中问题
jquery根据text选中option的问题: 网上找了好多,但发现因为jquery版本问题,很多并不能用. 最后成功了,写法如下: $('#shop option:contains(' + ...
- 编程哲学之C#篇:02——学习思维
<代码大全>的第二章:介绍隐喻(类比)的思维方式, <经济学原理>的第二章:介绍怎么像经济学家一样思考, <计算机的心智操作系统之哲学原理>的第一章:介绍学习操作系 ...
- 如何使用socket进行java网络编程(二)
通过在如何使用socket进行java网络编程(一)中程序的编写,可以总结出一些常用的java socket编程的范例来. ServerSocket server = new ServerSocket ...
- 程序媛计划——python socket通信
定义 socket 是进程间的一种通信方式,可以实现不同主机间的数据传输 #写服务期端程序server.py #实现服务器向客户端连接 #!/usr/bin/env python #coding:ut ...
- A - 开门人和关门人(sort+结构体)
点击打开链接 每天第一个到机房的人要把门打开,最后一个离开的人要把门关好.现有一堆杂乱的机房签 到.签离记录,请根据记录找出当天开门和关门的人. Input 测试输入的第一行给出记录的总天数N ( ...
- Chrome浏览器插件开发-淘宝自动登录
浏览器插件的介绍 Chrome浏览器插件开发的准备工作 manifest.json配置介绍 页面如何注入scripts文件 一. 浏览器插件的介绍 浏览器插件是一种遵循一定规范的应用程序接口编写出来的 ...
- python脚本 读取excel格式文件 并进行处理的方法
一.安装xlrd模块 pip install xlrd 二.读取excel文件 try: excel_obj = xlrd.open_workbook("文件路径") except ...