总结ref和out的区别
之前每次遇到ref和out时,老是忘记他们的使用方法和区别。每次都要网上搜一下别人写的博客来回忆。这次干脆自己整合一下别人博客的内容,方便下次忘记时查询。
用途:
在C#中通过使用方法来获取返回值时,通常只能得到一个返回值。因此,当一个方法需要返回多个值的时候,就需要用到ref和out。
概述:
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。
同:
1、都能返回多个返回值。
2、若要使用 ref 和out参数,则方法定义和调用方法都必须显式使用 ref和out 关键字。在方法中对参数的设置和改变将会直接影响函数调用之处(参数的初始值)。
异:
1、ref指定的参数在函数调用时候必须初始化,不能为空的引用。而out指定的参数在函数调用时候可以不初始化;
2、out指定的参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。
口诀:
ref有进有出,out只出不进。
正确的使用ref:
class Program
{
static void Main(string[] args)
{
Program pg = new Program();
int x = 10;
int y = 20;
pg.GetValue(ref x, ref y);
Console.WriteLine("x={0},y={1}", x, y); Console.ReadLine();
} public void GetValue(ref int x, ref int y)
{
x = 521;
y = 520;
}
}
运行结果为
x=521,y=520
错误的使用ref:
class Program
{
static void Main(string[] args)
{
Program pg = new Program();
int x;
int y; //此处x,y没有进行初始化,则编译不通过。
pg.GetValue(ref x, ref y);
Console.WriteLine("x={0},y={1}", x, y); Console.ReadLine();
} public void GetValue(ref int x, ref int y)
{
x = 1000;
y = 1;
}
}
正确的使用out:
class Program
{
static void Main(string[] args)
{
Program pg = new Program();
int x=10;
int y=233;
pg.Swap(out x, out y);
Console.WriteLine("x={0},y={1}", x, y); Console.ReadLine();
} public void Swap(out int a,out int b)
{
int temp = a; //a,b在函数内部没有赋初值,则出现错误。
a = 521;
b = 520;
}
}
运行结果为
x=521,y=520
错误的使用out:
class Program
{
static void Main(string[] args)
{
Program pg = new Program();
int x=10;
int y=233;
pg.Swap(out x, out y);
Console.WriteLine("x={0},y={1}", x, y); Console.ReadLine();
} public void Swap(out int a,out int b)
{
int temp = a; //a,b在函数内部没有赋初值,则出现错误。
a = b;
b = temp;
}
}
原文连接
https://www.cnblogs.com/wolf-sun/p/3371174.html
https://www.cnblogs.com/yanhan/archive/2013/01/26/2877889.html
总结ref和out的区别的更多相关文章
- ref和out的区别,值类型和引用类型的使用
今天刚刚明白ref和out的区别,只限于个人理解如有不同请赐教,谢谢 首先我感觉ref和out是针对于值类型来说,以前一直认为是针对于引用类型看下面的一段代码 1.首先结果 i=0:ints[0]=0 ...
- ref和out的区别?
ref 和out的区别在面试中会常问到: 首先:两者都是按地址传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传 ...
- ref和out的区别
ref类型参数是按地址传递,能改变原来的数值.使用ref传参前,变量必须赋值. 带有ref类型参数的函数,不会清空变量,所以离开该函数的时候,所有ref引用的变量可以赋值也可以不赋值. out类型参数 ...
- 浅谈C#中ref与out的区别
在C#这门高级语言中,你是否注意过ref与out的用法?你是否为在调用方法时需要多个返回值呢?不用急,接下来,我们去一起去研究一下这个问题... 其实呢,C#语言中,参数的传递一共有两种方法,值传递和 ...
- C#中的ref和out的区别
转载原地址 http://www.cnblogs.com/gjahead/archive/2008/02/28/1084871.html ref和out的区别在C# 中,既可以通过值也可以通过引用传递 ...
- 关于ref与out的区别
写在最前面 这几天一直在公司接受培训,都是一些基础的知识,同时也乘着这个机会巩固一下自己的基础,基础太重要了.前些时一直看的是多线程方面的知识,接下来我会写一些其他方面的知识,毕竟作为一个实习新人得和 ...
- C#中ref和out的区别浅析
这篇文章主要介绍了C#中ref和out的区别浅析,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢,需要的朋友可以参考下 在C#中通过使用方法来获取返回值时,通 ...
- 参数修饰符ref,out ,params的区别
参数修饰符ref,out ,params的区别 C#中有三个关键字-ref,out ,params,可是这三个之间的区别你都明白了吗? 那么我们就来认识一下参数修饰符ref,out ,params吧, ...
- ref与out的区别、冒泡排序、普通排序,以及二分法查询
一.首先我们先讲一下ref与out的区别和使用方法: 1.ref与out的区别: out:需要在使用前声明变量,分配地址但不能赋值,但是需要在使用中的时候需要初始化(进入方法体中的时候需要先赋值在使用 ...
- Spring框架xml配置中属性ref与value的区别
1.spring批量扫描mybatis的mapper,使用value 2.spring管理mybatis的单个mapper,用的是ref 虽然引用的是同一个bean,但两个对象的属相类型明显不一样,一 ...
随机推荐
- 开源免费3D CAD软件:FreeCAD
推荐:将 NSDT场景编辑器 加入你的3D开发工具链. FreeCAD是来自法国Matra Datavision公司的一款开源**3D CAD软件, 基于CAD / CAM / CAE几何模型核心,是 ...
- PostGIS之空间关系
1. 概述 PostGIS 是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在 SQL 中运行空间查询 PostGIS官网:About PostGIS | PostGIS ...
- LeetCode-442 数组中重复的数据
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-all-duplicates-in-an-array 题目描述 给你一个长度为 n 的整 ...
- python sys.argv(全局文本索引替换)
#利用sys.argv(实现从程序外部向程序传递参数.)写一个脚本.#全局替换(old_str to new_str,filename)import sys #导入sys模块print(sys.arg ...
- loj2511
引言 思维题. 这个做法跑得飞快,还不用 dp,也不是爆搜! 复杂度(可能)为 \(O(s^2t)\) 或 \(O(s^2)\),实际效率也是飞快. 不过这题我直接提交答案了. 思路 考虑 \(A=m ...
- mybatis日志打印到控制台
mybatis: configuration:# 日志输出到控制台 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- php 实现CURL请求接口
$ch = curl_init (); //初始化 @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查 @curl_setopt($ ...
- .net core 3.1项目运行在Windows server 2012R2服务器上,Decimal类型小数点不见了,求解!32112.7958
.net core 3.1项目运行在Windows server 2012R2服务器上,Decimal类型小数点不见了,求解! string str = "1002910.8241" ...
- [BOM] 封装一下cookie
function get_cookie(key) { var arr, reg = new RegExp("(^| )" + key + "=([^;]*)(;|$)&q ...
- Linux docker 安装nginx 配置ssl证书
Linux docker 安装nginx 配置ssl证书 如果觉得样式不好:跳转即可 md文件复制过来有些样式会不一样) 原文地址:https://lifengying.site/archives/b ...