ref out 相似

ref和out两个关键字的作用大致相同,但是有一些微妙但是重要的区别。

两者的行为相似到连编译器都认为这两者不能被重载:
public void SampleMethod(out int i) { }
public void SampleMethod(ref int i) { }
以上重载在编译时将被抛出一个错误,编译器认为out和ref是同样的行为,但是事实上在行为上他们有区别。

共同点

两者的值在调用函数中被修改后都会影响到原始值。

区别

ref一定要初始化,out不需要

因为out在调用方法使用之前会把参数值清空不管原本是什么值,所以out不需要初始化

ref是可能被修改,out是强制调用方法一定要修改其值。

但是上面那句话表明了什么?解读一下,便是ref传入的值在函数体中可能被修改,而out传入的值在函数体中是强制的一定要被赋值。

用在哪儿

方法无须有返回值,便可以获取想要的结果[例如:修改参数的值]

这些情况用赏心悦目

1、当我们频繁传递大型参数的时候,比如说DataTable、DataSet...的时候,会节省好多内存资源。
2、当我们想得到方法多样化的处理结果的时候,而我们又不愿意复杂化方法所返回的结果,那么我们可以在方法里定义多个ref 或者 out,以期得到丰富的结果。

比如说,我们调用一个方法,要同时得到string、int、double、bool、Array...等几种不同类型的结果,而return返回object又很复杂的时候,

ref 和out的处理效果,看上去将会是多么的赏心悦目...

ref 是有进有出,而out是只出不进

或者换句话说:ref 是有进有出,而out是只出不进

ref 关键字使用参数按引用传递,而不是值,通过引用传递的效果是在调用方法中对参数的任何修改都会反映在在该变量中。引用参数的值与基础参数变量的值始终是一样的。
1.属性不是变量,因此不能作为 ref 参数传递
2.尽管ref 和 out 在运行时的处理方式不同,但它们在编译时的处理方式是相同的。因此,如果一个方法采用 ref参数,而另一个方法采用out参数,则无法重载这两个方法。
如果尝试这么做,将导致不能编译该代码。
3.如果一个方法采用 ref 或out参数,而另一个方法不采用这两类参数,则可以进行重载。

示例程序

public class MyApp{
public static void UseRef(ref int i){
i+=100;
Console.WriteLine("i={0}",i);
} static void Main(){ int i=10;
Console.WriteLine("before : i={0}",i);
UseRef(ref i);
Console.WriteLine("after : i={0}",i);
}
}
/* before : i=10;
i=110;
* after : i=110;
*/ //out关键字会导致参数通过引用来传递,这引ref关键字类似,但你必须在调用方法里对 参数进行重新赋值,否则编译不通过
与ref的不同之处:
1.ref要求变量必须在传递之前进行初始化
2.尽管作为out参数传递的变量不需要在传递之前进行初始化,但需要调用方法以便在方法返回之前赋值 public class MyApp{
public static void UseOut(out int i){
i+=100;
Console.WriteLine("i={0}",i);
} static void Main(){ int i;//out 这里可以不初始化
Console.WriteLine("before : i={0}",i);
UseOut(out i);
Console.WriteLine("after : i={0}",i);
}
}
/* before : i=0;
i=100;
* after : i=100;
*/

ref out 方法参数的更多相关文章

  1. Params 方法参数

    params,ref,out 方法参数 示例 在下面的方法使用中 OpenWindow(params object[] args) 传递的参数args添加了params修饰 public void O ...

  2. 利用反射调用方法时,处理ref,out参数需要注意的问题(转)

    转自:http://www.68idc.cn/help/buildlang/ask/20150318283817.html 项目中如下的泛型方法,因为要在运行时,动态指定类型参数,所以要利用反射来实现 ...

  3. C# 参考之方法参数关键字:params、ref及out

    如果在为方法声明参数时未使用 ref 或 out,则该参数可以具有关联的值.可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值.通过使用方法参数关键字,可以更改这种行为. params ...

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

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

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

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

  6. C# 方法参数 out、ref、param 详解

    ref和out都对函数参数采用引用传递形式——不管是值类型参数还是引用类型参数,并且定义函数和调用函数时都必须显示生命该参数为 ref/out形式.两者都可以使函数传回多个结果. ref 类似于 PH ...

  7. 【.net 深呼吸】细说CodeDom(6):方法参数

    本文老周就给大伙伴们介绍一下方法参数代码的生成. 在开始之前,先补充一下上一篇烂文的内容.在上一篇文章中,老周检讨了 MemberAttributes 枚举的用法,老周此前误以为该枚举不能进行按位操作 ...

  8. [C#]浅析ref、out参数

    转载:http://www.cnblogs.com/vd630/p/4601919.html#top 按引用传递的参数算是C#与很多其他语言相比的一大特色,想要深入理解这一概念应该说不是一件容易的事, ...

  9. Ref和Out参数的区别(转帖)

    首先,如果不使用这两个关键字,那是什么样 呢? 看下面的例子: using System;   class Test   {   static void Swap(ref int x, ref int ...

随机推荐

  1. [vim] vim入门

    1. 概述 工欲善其事 必先利其器.vim是非常好用的文本编辑器,可以将它看作是vi的进阶.绝大多数Unix系统都会内置vi编辑器,vi是文本编辑器,vim是程序编辑器.相比vi,它可以根据文件的类型 ...

  2. jQuery eislideshow 图片轮播

    在线实例 基础演示 自动播放 使用方法 <div id="ei-slider" class="ei-slider"> <ul class=&q ...

  3. ASP.Net页面刷新后自动滚动到原来位置

    在网上搜索之后总结了三种方式: 1.设置Page中的MaintainScrollPositionOnPostback属性为true A>.页面里有MaintainScrollPositionOn ...

  4. SharePoint 2013 内容部署功能简介

    在之前的项目中,当客户有新的需求的时候,我们通常在测试环境上开发或者实施,然后手动在生产环境再弄一次.当发现内容部署这个东西,才知道这样是多么不合理的.我们可以创建两个网站集,一个用来修改,然后通过计 ...

  5. FIJ Jobs – 2013/8/12

    Department Vacancies Total Skill Set Experience Language Systems Systems Coordinator 1 Communication ...

  6. 转:HTTP 1.1与HTTP 1.0的比较

    原文地址:http://blog.csdn.net/elifefly/article/details/3964766 HTTP 1.1与HTTP 1.0的比较 一个WEB站点每天可能要接收到上百万的用 ...

  7. Android软键盘与输入框的设置

    大家开发Android或者用app的时候会发现转到输入框就会自动弹出软键盘,切换别的页面就会自动的隐藏,下面几行代码用的熟练了就行了: 1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) I ...

  8. 选择排序(java版)

    public class SelectSortTest { public static void selectSort(int[] source) { for (int i = 0; i < s ...

  9. java注解框架

    我们经常会在java代码里面看到:“@Override”,“@Target”等等样子的东西,这些是什么? 在java里面它们是“注解”. 下面是百度百科的解释:java.lang.annotation ...

  10. linux 2>&1

    2>&1就是用来将标准错误2重定向到标准输出1中的.此处1前面的&就是为了让bash将1解释成标准输出而不是文件1.至于最后一个&,则是让bash在后台执行 例如:/us ...