之前学习C#时候就遇到了这个问题,不过当时没有深究。昨晚想到这个问题时候自己尝试敲了敲代码,结果从运行的结果来看,越看越乱。在查看了一些资料的基础上,自己总结了一下。
可能会有点乱,但是自己总结出来的东西。
 
一:ref 关键字使参数按引用传递。
其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
也即是说,在方法中对参数的设置和改变将会直接影响函数调用之处(代码①及②)。无论是函数的定义还是调用时均不可忽略关键字ref.
可以对比代码:
代码①:

 1 class Program
2 {
3 static void Main(string[] args)
4 {
5 Program pg = new Program();
6 int x = 10;
7 int y = 20;
8 pg.GetValue(ref x, ref y);
9 Console.WriteLine("x={0},y={1}", x, y);
10
11 Console.ReadLine();
12
13 }
14
15 public void GetValue(ref int x, ref int y)
16 {
17 x = 521;
18 y = 520;
19 }
20 }
运行结果为

代码②:

 1 class Program
2 {
3 static void Main(string[] args)
4 {
5 Program pg = new Program();
6 int x = 10;
7 int y = 20;
8 pg.GetValue(ref x, ref y);
9 Console.WriteLine("x={0},y={1}", x, y);
10
11 Console.ReadLine();
12
13 }
14
15 public void GetValue(ref int x, ref int y)
16 {
17 x = 1000;
18 y = 1;
19 }
20 }

由代码① 和②的运行结果可以看出,在方法中对参数所做的任何更改都将反映在该变量中,而在main函数中对参数的赋值却没有起到作用,这是不是说明不需要进行初始化呢?来看第二点

二:ref定义的参数在使用前必须初始化,无论在函数定义时候参数有没有赋予初值。这条正好区分out指定的参数可以不在调用函数的时候进行初始化。
来看代码③ 以及其运行结果:
 1  class Program
2 {
3 static void Main(string[] args)
4 {
5 Program pg = new Program();
6 int x;
7 int y; //此处x,y没有进行初始化,则编译不通过。
8 pg.GetValue(ref x, ref y);
9 Console.WriteLine("x={0},y={1}", x, y);
10
11 Console.ReadLine();
12
13 }
14
15 public void GetValue(ref int x, ref int y)
16 {
17 x = 1000;
18 y = 1;
19 }
20 }

出现的错误为:使用了未赋值的局部变量“x”,“y”。故可以说明ref指定的参数无论在函数定义的时候有没有赋予初值,在使用的时候必须初始化。

三 :对out来说,第一条同样适用。将代码①以及②中的ref全部修改成out,则可与使用ref得到同样的结果。
 
四:out指定的参数必须在函数定义的时候就赋初值。否则则出现错误。对比ref指定的参数则可以不在函数内部进行赋初值,在函数调用时候再赋初值也可以。
代码④:

 1 class Program
2 {
3 static void Main(string[] args)
4 {
5 Program pg = new Program();
6 int x=10;
7 int y=233;
8 pg.Swap(out x, out y);
9 Console.WriteLine("x={0},y={1}", x, y);
10
11 Console.ReadLine();
12
13 }
14
15 public void Swap(out int a,out int b)
16 {
17
18 int temp = a; //a,b在函数内部没有赋初值,则出现错误。
19 a = b;
20 b = temp;
21 }
22
23 }
出现错误:使用了未赋值的out参数“a”,"b"
则在swap函数定义时候给a,b赋上初值则运行正确。
 
总结以上四条得到ref和out使用时的区别是:
①:ref指定的参数在函数调用时候必须初始化,不能为空的引用。而out指定的参数在函数调用时候可以不初始化;
②:out指定的参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。

C#ref和out的区别-ref是有进有出,out是只出不进的更多相关文章

  1. ref和out的区别

    ref类型参数是按地址传递,能改变原来的数值.使用ref传参前,变量必须赋值. 带有ref类型参数的函数,不会清空变量,所以离开该函数的时候,所有ref引用的变量可以赋值也可以不赋值. out类型参数 ...

  2. ref与out区别(ref有进有出,而out只出不进)

    ref与out区别(ref有进有出,而out只出不进)   C#基础:ref和out的区别 ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值 ...

  3. C# 中ref与out关键字区别

    ref 关键字通过引用传递的参数的内存地址,而不是值.简单点说就是在方法中对参数的任何改变都会改变调用方的基础参数中.代码举例: class RefExample { static void Meth ...

  4. .net 中 ref out params的区别

    C#中有三个关键字-ref,out ,params,虽然本人不喜欢这三个关键字,因为它们疑似破坏面向对象特性.但是既然m$把融入在c#体系中,那么我们就来认识一下参数修饰符ref,out ,param ...

  5. C# ref和out的区别

    首先:两者都是按地址传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所 ...

  6. ref和out的区别,值类型和引用类型的使用

    今天刚刚明白ref和out的区别,只限于个人理解如有不同请赐教,谢谢 首先我感觉ref和out是针对于值类型来说,以前一直认为是针对于引用类型看下面的一段代码 1.首先结果 i=0:ints[0]=0 ...

  7. ref和out的区别?

    ref 和out的区别在面试中会常问到: 首先:两者都是按地址传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传 ...

  8. 浅谈C#中ref与out的区别

    在C#这门高级语言中,你是否注意过ref与out的用法?你是否为在调用方法时需要多个返回值呢?不用急,接下来,我们去一起去研究一下这个问题... 其实呢,C#语言中,参数的传递一共有两种方法,值传递和 ...

  9. C#中的ref和out的区别

    转载原地址 http://www.cnblogs.com/gjahead/archive/2008/02/28/1084871.html ref和out的区别在C# 中,既可以通过值也可以通过引用传递 ...

随机推荐

  1. ios开发 学习积累20161101

    20161101 XML的声明 <?XML version="1.0" encoding="UTF-8" ?> XML文档必须有根元素 XML 对大 ...

  2. 【原】Java跨域以及实现原理

     前言:最近研究了一下跨域,主要是jsonp的实现,经过测试后总结如下: 一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面.动态网页.web服务.WCF,只要是跨 ...

  3. sql server web管理软件

    Sql server目前虽然没有mysql用户量大,但是微软的产品在易用性方面还是很不错的,有些政务类的项目还是用 Sql server数据库的, 目前有一款Sql server的web管理工具Tre ...

  4. linux ssh免密登陆

    大致流程: 两台linux系统A B 如果A要登陆到B 1.生成A的密钥对 2.将A的公钥拷贝到B的authorized_keys中即可 可以使用命令:ssh-copy-id -i ~/.ssh/id ...

  5. C#学习笔记-代理模式

    题目:A追B,但是羞于表示,所以A通过C给B一直送礼物以讨得欢心. 分析: 根据就分为三个类,SchoolGirl一个类,这个类只需要获得名字就好了:Pursuit一个类,这个类需要实现送礼物这个方法 ...

  6. jQuery轮播图(一)轮播实现并封装

    利用面向对象自己动手写了一个封装好的jquery轮播组件,可满足一般需求,不仅使用简单且复用性高. demo:点此预览 代码地址:https://github.com/zsqosos/componen ...

  7. .NET 跨平台服务端资料

    OWIN Web API:  http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web- ...

  8. C# 后台添加Log信息

    我们在做项目的时候,经常会使用到Log日志,今天分享一下如何在后台添加Log信息 创建一个写Log的方法: public void WriteLog(string Action) { try { st ...

  9. 阿里,百度,腾讯招聘 Java 程序员的技术标准

    阿里巴巴篇 扎实的计算机专业基础,包括算法和数据结构,操作系统,计算机网络,计算机体系结构,数据库等 具有扎实的Java编程基础,理解IO.多线程等基础框架 熟练使用Linux系统的常用命令及shel ...

  10. Integer ==判断遇到的问题

      今天开发过程中,遇到 这样的一个问题 public class Test { public static void main(String[] args) { Integer aa = 12345 ...