[C#] out vs ref
当需要从一个方法中有多个返回值时可以考虑使用out和ref这两个关键字。下面通过代码的方式来说明两者的用法和不同之处。
例如现在有一个如下的Add方法,Add方法只有一个返回值。
static int Add(int num1, int num2)
{
return num1 + num2;
}
把这个例子修改的复杂点,现在需要有4个返回值。这时候out关键字就派上用场了。
static void Maths(int num1, int num2)
{
int add = num1 + num2;
int sub = num1 - num2;
int divide = num1 / num2;
int multi = num1 * num2;
}
上述代码中,我想将计算后的add,sub,divide,multi四个值均返回给调用方法。使用out关键字来改造这个方法。
static void Maths(
int num1,
int num2,
out int add,
out int sub,
out int divide,
out int multi)
{
add = num1 + num2;
sub = num1 - num2;
divide = num1 / num2;
multi = num1 * num2;
}
使用下面的代码调用改造后的Maths方法
int add, sub, multi, div = ; Maths(, , out add, out sub, out multi, out div);
两个注意点:
1. 调用方法和被调用方法需要返回值的参数需要使用out修饰;
2. 在调用方法中,不需要给out参数赋值。即使赋值了,在被调用方法中也会被重新计算。
再来看另一个关于交换两个数值的例子,
static void Swap(int num1, int num2)
{
num1 = num1 + num2;
num2 = num1 - num2;
num1 = num1 - num2;
}
使用ref关键字改造这个方法,
static void Swap(ref int num1, ref int num2)
{
num1 = num1 + num2;
num2 = num1 - num2;
num1 = num1 - num2;
}
在调用方法中,需要添加ref关键字修饰
int num1 = ; int num2 = ; Swap(ref num1, ref num2);
使用ref修饰的参数,会把在调用方法中的数据传递到被调用方法中。当被调用方法中修改了ref修饰参数的值,调用方法中的相应的参数值也会同时被修改。下面通过一张图来表示out和ref的使用及参数关系。
总结:
当需要有多个返回参数时可以考虑使用out/ref参数;
ref数据的修改是双向的;
out数据只从被调用方法传递至调用方法,如果调用方法给out参数赋值,被调用方法会忽略掉这些数据。
感谢您的阅读~
[C#] out vs ref的更多相关文章
- .NET 基础一步步一幕幕[out、ref、params]
out.ref.params out: 如果你在一个方法中,返回多个相同类型的值的时候,可以考虑返回一个数组. 但是,如果返回多个不同类型的值的时候,返回数组就不行了,那么这个时候, 我们可以考虑使用 ...
- out和ref详解
要想充分理解C# out和ref,必须先明确如下两个概念(对值类型与引用类型掌握比较好的,可以跳过"一.明确两个基本概念") 一.明确两个基本概念 值类型: 定义:通过值的方式来传 ...
- c#编程基础之ref、out参数
引例: 先看这个源码,函数传递后由于传递的是副本所以真正的值并没有改变. 源码如下: using System; using System.Collections.Generic; using Sys ...
- C#中out和ref之间的区别【转】
首先:两者都是按地址传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所 ...
- 通过一个实例重新认识引用类型,值类型,数组,堆栈,ref
昨天在写代码时候遇到了一个问题,百思不得其解,感觉颠覆了自己对C#基础知识的认知,因为具体的情境涉及公司代码不便放出,我在这里举个例子,先上整个测试所有的代码,然后一一讲解我的思考过程: using ...
- 图解C#的值类型,引用类型,栈,堆,ref,out
C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解.还有托管堆,栈,ref,out等等概念也是每个C#程序员都会接触到的概念,也是C#程序员面试经常考到的知识,随便搜搜 ...
- 异步方法不能使用ref和out的解决方法
异常处理汇总-后端系列:http://www.cnblogs.com/dunitian/p/4523006.html 应用场景==>后端现在都是用异步方法,那么分页是必不可少的,于是就有了这个问 ...
- [C#]浅析ref、out参数
转载:http://www.cnblogs.com/vd630/p/4601919.html#top 按引用传递的参数算是C#与很多其他语言相比的一大特色,想要深入理解这一概念应该说不是一件容易的事, ...
- C#基础-out与ref字段
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- C# out ref 重载
今天看极客学院wiki时候看到了out,ref的介绍,之前对这个知识点没有深刻认识,所以就写了个小测试看了下,瞬间明白了. using System; using System.Collections ...
随机推荐
- meta小结
mate 标签定义及使用说明 元数据(Metadata)是数据的数据信息. 标签提供了 HTML 文档的元数据.元数据不会显示在客户端,当时会被浏览器解析. META元素通常用于指定网页的描述,关键词 ...
- 用py2exe将python文件转换成exe可执行程序
1.首先需要安装py2exe模块,下载地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/ 然后用pip install 命令安装py2exe模块,如果你用的py ...
- cygwin安装gcc/g++
安装cygwin如果按照默认的方式一直点下去的话,安装完了会发现没有安装gcc/g++. 这个时候可以在安装文件的目录打开命令行,并输入: setup-x86_64.exe -q -P wget -P ...
- NavigationView的头部的事件监听
现在App的UI设计中Drawerlayout+NavigationView是一个比较常用的设计了,而以前我一般只是在Navigation中的menu(即下部的item中)添加事件监听,而今天碰到一个 ...
- tp框架---验证码详解
很多注册登录界面都会验证码,用tp如何实现验证码的功能呢? 在tp中:Think\Verify类可以支持验证码的生成和验证功能. 首先,看一下逻辑: (1)如何生成?------ 先做Yanzheng ...
- TortoiseGit上传项目到github方法(超简单)
Github是咱广大开发者用的非常多的项目版本管理网站,项目托管可以是私人的(private)或者公开的(public),私人的收费,一个月7美金.咱这里就只说我们个人使用的,一般都是代码对外开放的: ...
- mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...
- 数据库sql优化方案
声明:这个不是我自己写的,是我们老师给我,我拿出来分享一下! 为什么要优化: 随着实际项目的启动,数据库经过一段时间的运行,最初的数据库设置,会与实际数据库运行性能会有一些差异,这时我们 ...
- thinkphp 3.2 发送邮件(Phpmailer)
1.在该模板下Conmon模块函数公共目录新建一个function.php <?php function Sendemail(){ vendor('PHPMailer.class#phpmail ...
- Spring Ioc-依赖注入的几种方式
一 setter方法注入 配置文件如下: <bean id="helloAction" class="org.yoo.action.SpringSetterHell ...