首先我们要知道ref和out在C#里面是什么?

答:它们俩是C#里面的关键字。

他们俩是干啥的呢?

答:他们俩是方法参数的修饰符号,一但使用,方法定义和方法都用都要使用这个关键字,这一点是死规定。

好了废话不多说,既然是修饰符,使用了他们一定是要有意义的对吧。我们先来看一手微软官方定义。

如果大家通过上面微软官方的定义明白了这个参数。那很好,下面的我写的就不需要看啦!还有疑惑就继续往下看。保证你能懂。

这里我先不直接讲解,我先掏出一手代码,然后通过代码讲解。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ref和outTest
{
class Program
{
static void Main(string[] args)
{
int i = ;
Test(i);
Console.WriteLine(i.ToString());
Console.ReadKey();
}
static void Test(int i)
{
i++;
Console.WriteLine(i.ToString()); }
}
}

  这代码没啥含量,学过代码都看到懂的,就是定义个i变量,然后调用Test方法,方法里面对i进行+1的操作然后打印i的值,main函数里也打印一次i的值。

结果大家应该也都知道 方法里面打印的是main方法打印的是0,方法里面是1。

  因为默认情况下,我们方法传递变量默认是是"值传递"的方式。这是什么意思呢?说到这里要先解释下引用类型和值类型,可以看我的一篇博客----->传送门。我这里简单说下。引用类型的值存的是指向对象本身或者值的地址,值类型的变量存的是对象的本身或者是值。一个经典的比喻,值类型就是报纸,引用类型就是网页。我看报纸就要买一份报纸。我得到的就是实际的报纸,但是我浏览网页只要输入一个Url地址。Url指向了实际网站内容。

  解释完毕,我们再把思路拉回来,我们说方法传递的变量默认是"值传递"。就是说我报纸看的哈哈大笑,这时候小明也想看。我就又买了一份给他。但是我们看的内容是一样的。但是我的报纸还是我的报纸。小明看完报纸就撕了报纸都不影响我,值传递就是方法的变量的值传递值之后。不论方法里面对这个值进行了什么操作。都不影响我方法外面的i。所以这个地方输出的结果是 1和0

我觉得上面应该讲的还挺易懂的吧,还有疑问算我失败。

接下来我们加上Ref关键字了,改一手代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ref和outTest
{
class Program
{
static void Main(string[] args)
{
int i = ;
Test(ref i);
Console.WriteLine(i.ToString());
Console.ReadKey();
}
static void Test(ref int i)
{
i++;
Console.WriteLine(i.ToString()); }
}
}

ref关键字,文章的开头微软的官方解释已经说明了。使用了Ref参数之后,方法参数的传递是按"引用传递"的,"引用传递"什么意思上面讲解我也解释了。举个例子,这就比如我看到某某网站不顺眼。就找了一个黑客,然后把网站地址告诉了黑客,让它帮我黑了这个网站。让黑客在网站的首页显示"一小时小超人最帅的字",要特大号显示,那黑客就会通过我给的Url黑了这个网站的服务器。然后我一刷新网页。这个网页就显示了"一小时小超人最帅"。

这个代码也是一样。加了ref 之后 i变量传递是对象的引用也是网页的Url,方法内部修改是通过这个地址找了真的值然后进行修改,所有外面的i也发生了变化。

讲到这里大家应该明白了吧。

out关键字和ref 都是使变量通过引用传递。这一点他们是一样的。唯一的不通就是。ref的参数必须在调用方法前就初始化。而out参数必须在方法内部初始化。通过这一点的不同通他们的应用场景也就不同了。

场景一个 有个程序是 中国人民币的汇率进行换算。现在有10块钱。要通过一个方法进行换算。这个时候就应该用ref。因为这个10块钱初始值很重要对吧。我必须在方法外面就要定义我的人民币是多少钱。

场景二就是 int.TryPase(参数1, out 参数2)这个C#转换方法,通过参数1,将参数2转换为int类型。这个时候参数2的初始值是多少就没有意义了是吧,因为它最后计算的结果,是跟参数1的值有关系,跟它初始值的没有一毛钱的关系的。所以这个地方应该用out。

Ok。讲到这里就结束了哈。

如果刚开始学习的小伙伴还有疑问的话,可以评论咱们一起学习。

如果哪位大牛随便瞄到个错误,也请告之我,让我能够进步。

对了out的代码没有,是因为两个语法是一样的。

5.C#知识点:ref和Out关键字浅谈的更多相关文章

  1. C#知识点:ref和Out关键字浅谈

    首先我们要知道ref和out在C#里面是什么? 答:它们俩是C#里面的关键字. 他们俩是干啥的呢? 答:他们俩是方法参数的修饰符号,一但使用,方法定义和方法都用都要使用这个关键字,这一点是死规定. 好 ...

  2. C++ 关键字浅谈

    这里有一个游戏:要求写一个符合C++标准的程序,包含至少十个连续而且不同的关键字.连续是指不能被标识符.运算符.标点符号分割.注意这里的“不同”要求,别想用 int main() { return s ...

  3. [UE4]C++中extern关键字浅谈

    变量声明和变量是有区别的 extern int i; //只是声明i而非定义i int j; //声明而且还定义了j 任何一个显式初始化的声明都将成为定义,而不管有没有extern,extern语句一 ...

  4. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  5. ref:浅谈XXE漏洞攻击与防御

    ref:https://thief.one/2017/06/20/1/ 浅谈XXE漏洞攻击与防御 发表于 2017-06-20   |   分类于 web安全  |   热度 3189 ℃ 你会挽着我 ...

  6. 浅谈c#的三个高级参数ref out 和Params C#中is与as的区别分析 “登陆”与“登录”有何区别 经典SQL语句大全(绝对的经典)

    浅谈c#的三个高级参数ref out 和Params   c#的三个高级参数ref out 和Params 前言:在我们学习c#基础的时候,我们会学习到c#的三个高级的参数,分别是out .ref 和 ...

  7. 浅谈async、await关键字 => 深谈async、await关键字

    前言 之前写过有关异步的文章,对这方面一直比较弱,感觉还是不太理解,于是会花点时间去好好学习这一块,我们由浅入深,文中若有叙述不稳妥之处,还请批评指正. 话题 (1)是不是将方法用async关键字标识 ...

  8. 为什么C#中ref和out 关键字 ?

    需求假设:现需要通过一个叫Swap的方法交换a,b两个变量的值.交换前a=1,b=2,断言:交换后a=2,b=1. 现编码如下: class Program   {       static void ...

  9. c#中ref和out 关键字

    问题:为什么c#中要有ref和out?(而java中没有)需求假设:现需要通过一个叫Swap的方法交换a,b两个变量的值.交换前a=1,b=2,断言:交换后a=2,b=1. 现编码如下: class ...

随机推荐

  1. ip网段变更

    背景 公司网络跟集团靠拢,先走第一步:IP网段变更.从XX网段切换到OO网段 方法 1. 准备工作 a. 保证IPMI连接正常 b. 获得新IP并核对对应主机名.旧IP是否相符 2. 确认网卡名称 # ...

  2. DOM扩展:DOM API的进一步增强[总结篇-下]

    本文承接<DOM扩展:DOM API的进一步增强[总结篇-上]>,继续总结DOM扩展相关的功能和API. 3.6 插入标记 DOM1级中的接口已经提供了向文档中插入内容的接口,但是在给文档 ...

  3. 创建python3虚拟环境指令和冻结所安装的包

    mkvirtualenv file_name -p python3 去掉后面的 P 和python3 代表创建python2环境 其中p代表路径的意思 冻结所安装包命令 pip freeze > ...

  4. Odoo 学习地址

    Odoo官文文档: https://www.odoo.com/zh_cn/page/docs http://www.odoo.com/documentation/8.0/ Odoo中文文档推荐: ht ...

  5. 剑指offer一之二维数组中的查找

    一.题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 二.解答方法: 方法 ...

  6. MVC3学习:实现文章上一篇下一篇链接

    文章的显示都是通过id查询数据库来显示.但是文章会经常删除,因此id号可能不是连续的,所以上一篇下一篇文章,不能简单的做id加减法. 我的思路是:先将表格中所有文章的ID号全部放入一个数组中,如果文章 ...

  7. C# 多线程六之Task(任务)二

    前面介绍了Task的由来,以及简单的使用,包括开启任务,处理任务的超时.异常.取消.以及如果获取任务的返回值,在回去返回值之后,立即唤起新的线程处理返回值.且如果前面的任务发生异常,唤起任务如果有效的 ...

  8. python 继承 多态

    python 的继承 #-*- coding:utf-8 -*-class A(object): def __init__(self): print('A:我是肯定会执行的!!') def fun(s ...

  9. MongoDB作为windows服务来安装

    首先区官网下载对应版本的安装文件,我本地的环境是win7 bit64 我下载的版本是:mongodb-win32-x86_64-2.4.6 ok, 文件下载后,开始安装,这里要说一下,如果直接启动Mo ...

  10. ASP.NET Core 中使用 Hangfire 定时启动 Scrapyd 爬虫

    用 Scrapy 做好的爬虫使用 Scrapyd 来管理发布启动等工作,每次手动执行也很繁琐;考虑可以使用 Hangfire 集成在 web 工程里. Scrapyd 中启动爬虫的请求如下: curl ...