ref 关键字和out关键字均会导致参数通过引用来传递(相同点1)。这是两者的共同点。

通过引用传递参数,会使方法中对参数所做的任何修改都将反映在该变量中。

两者还有一个共同点,那就是:若要使用 ref 参数或out参数,则方法定义和调用方法都必须显式使用 ref 关键字或out关键字(相同点2)。

那两者有什么不同点呢?

两者的不同点就是:传递到 ref 参数的参数必须最先初始化,而out参数在传递之前不需要显式初始化(不同点)。

下面来看个简单的例子,该实例包括两部分。

先给出第一部分代码,如下:

static void Main(string[] args)
{
int a = 0;
ExpWithRef(ref a);
Console.WriteLine(a);
int b = 0;
ExpWithOutRef(b);
Console.WriteLine(b);
}
private static void ExpWithRef(ref int x)
{
x = x + 1;
}
private static void ExpWithOutRef(int y)
{
y = y + 1;
}

这部分代码运行后输出“1 0”。

因为ExpWithRef方法通过引用传递参数,所以执行完代码“ExpWithRef(ref a)”后,a的值被改变,变成了1。而ExpWithOutRef方法通过值传递参数,所以执行完代码“ExpWithOutRef(b)”后,b的值保持不变,仍为0。

另外,ExpWithRef方法通过ref引用传递参数,所以方法定义和调用方法都显式地使用了 ref 关键字,且实参a在函数调用前已被初始化。

下面给出第二部分实例代码:

static void Main(string[] args)
{
int a;
ExpWithOut(out a);
Console.WriteLine(a);
}
private static void ExpWithOut(out int x)
{
x = 0;
x = x + 1;
}

这部分代码中,ExpWithOut方法通过out引用传递参数,所以参数a在方法调用前并没有初始化,而是在ExpWithOut方法内部进行初始化,并对其加1,函数调用返回后参数a的值变成了1(记住,这里是引用传递参数),所以最后的输出结果为“1”。

好了,就这些了。

C#中ref参数及out参数对比的更多相关文章

  1. C# ref和out传递参数总结

    如有雷同,不胜荣幸,若转载,请注明 C#中ref和out传递参数总结,两个都可用来传递参数,ref使用时必须先进行初始化,out则不需要,只要在返回之前赋值即可,文字废话到此,下面直接上例子 ref例 ...

  2. C#方法中三个重要的参数:out、ref、params

    备注:适用于初学者,自学于传智播客. 1.out参数. 概念:如果在一个方法中,返回多个相同类型值的时候,可以考虑返回一数组.但是返回多个不同类型值的时候,返回数组显然不能解决问题,这时就引入out参 ...

  3. 工作中的趣事:聊聊ref/out和方法参数的传递机制

    0x00 前言 我在之前的游戏公司工作的时候,常常是作为一只埋头实现业务逻辑的码农.在工作之中不常有同事会对关于编程的话题进行交流,而工作之余也没有专门的时间进行技术分享.所以对我而言上家虽然是一家游 ...

  4. C#中的out 参数,ref参数,值参数

    大家可能在编码中或多或少的使用过out的ref,但是是否注意过他两的详细用法以及区别? 本文想介绍下详细介绍下out参数,ref参数以及一般值参数. 值参数 在使用参数时,把一个值传递给函数使用的一个 ...

  5. .NET框架- in ,out, ref , paras使用的代码总结 C#中in,out,ref的作用 C#需知--长度可变参数--Params C#中的 具名参数 和 可选参数 DEMO

    C#.net 提供的4个关键字,in,out,ref,paras开发中会经常用到,那么它们如何使用呢? 又有什么区别? 1 in in只用在委托和接口中: 例子: 1 2 3 4 5 6 7 8 9 ...

  6. c# 方法参数(传值,传引用,ref,out,params,可选参数,命名参数)

       一.方法参数的类型----值类型和引用类型 当方法传递的参数是值类型时,变量的栈数据会完整地复制到目标参数中即实参和形参中的数据相同但存放在内存的不同位置.所以,在目标方法中对形参所做的更改不会 ...

  7. 给方法传递参数:ref参数和out参数

    /*--------------------------------------------------- 给方法传递参数:ref参数和out参数 (P106) ------------------- ...

  8. 方法的形参、ref参数、out参数的区别

    我们在定义方法时,经常会涉及到传参.因为引用类型的数据在用变量存储时,是存储的地址,所以在传参时,依然是传递的地址,但是值类型的数据在传参时就会有所不同.值类型数据在调用方法传参时,普通情况下是值传递 ...

  9. js 获取url中的参数 修改url 参数 移除url参数

    js 获取url中的参数 修改url 参数 移除url参数 var jsUrlHelper = { getUrlParam : function(url, ref) { var str = " ...

随机推荐

  1. Ubuntu 15.04 安装rmagick 2.15.4

    apt-get install  pkg-config, libmagick-dev,libmagickcore-dev, libmagickwand-dev, gem install rmagick

  2. myeclipse 8.6 插件安装之SVN

    在这里我要说明一点,myEclipse 8.6的插件安装和之前的版本可能会有一些区别,下面是SVN插件的安装: 1.从官网下载site-1.6.13.zip文件,网址是:subclipse.tigri ...

  3. poj2774之最长公共子串

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 18794   Accepted: 77 ...

  4. r语言之散点图类型type参数

    type参数用来控制所生成散点图的类型,有如下几个选项: type=“p”表示绘制单独的点 type=“l”表示绘制点连成的折线 type=“b”表示有线连接的点 type=“o”表示将点绘在线上 t ...

  5. [LeetCode]题解(python):029-Divide Two Integers

    题目来源: https://leetcode.com/problems/divide-two-integers/ 题意分析: 不用乘法,除法和mod运算来实现一个除法.如果数值超过了int类型那么返回 ...

  6. 图的BFS代码

    图是严蔚敏书上P168的图, 图的邻接表存储,DFS可以看以前写的文章:http://www.cnblogs.com/youxin/archive/2012/07/28/2613362.html ]; ...

  7. utf8字节

    <pre name="code" class="html">[root@wx03 0724]# perl a1.pl 112 [root@wx03 ...

  8. perl 安装Net::ZooKeeper

    <pre name="code" class="python"><pre name="code" class=" ...

  9. Uva 1061 The Morning after Halloween

    基本思路是BFS: 1. 题目中已经说了,每相连的2X2格子中必有一个‘#’,也就是,每个点周围最多也就三个方向可以走.因此,可以把所有空格都提出来,形成一个图,直接遍历每条边,而不是每次判断4个方向 ...

  10. 大Q品牌故事_大Q官网_腾讯旗下买卖宝公司倾力打造

    大Q品牌故事_大Q官网_腾讯旗下买卖宝公司倾力打造 走在大路上的改变者,有态度的互联网手机品牌