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

 1 class Program2     {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 Program2     {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 Program2     {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 Program2     {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指定的参数不需要。
注:本文转载于:http://www.cnblogs.com/yanhan/archive/2013/01/26/2877889.html

转载于:https://www.cnblogs.com/GISQZC/p/5191922.html

C#中out和ref之间的区别相关推荐

  1. C#中out和ref之间的区别【转】

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

  2. python观察日志(part20)--列表中加号,extend,append之间的区别

    学习笔记,仅供参考,有错必纠 列表中"+"加号,extend,append之间的区别 extend extend函数用于在列表末尾一次性追加另一个序列中的多个值. append a ...

  3. python __import__和import区别_Python中import 与__import__() 之间的区别比较

    本篇文章给大家带来的内容是关于Python中import 与__import__() 之间的区别比较,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 首先来说一下两者的区别: impo ...

  4. sql server序列_SQL Server中身份和序列之间的区别

    sql server序列 In SQL Server, both the SEQUENCE object and IDENTITY property are used to generate a se ...

  5. Oracle中用户和架构之间的区别?

    本文翻译自:Difference between a user and a schema in Oracle? Oracle中的用户和架构有什么区别? #1楼 参考:https://stackoom. ...

  6. C#中Int64和UInt64之间的区别

    Int64:此 Struct用于表示64位带符号整数.所述的Int64 可以两种类型的值,包括所述范围之间的负的和正的存储-9,223,372,036,854,775,808至9,223,372,03 ...

  7. -ms-flexbox_Flexbox中width和flex-basis之间的区别

    -ms-flexbox by Kyle Gallagher 凯尔·加拉格尔(Kyle Gallagher) Flexbox中width和flex-basis之间的区别 (The difference ...

  8. Jquery中.val()与.value之间的区别

    三年多没敲过代码了,今年打算捡起来,是需要多么大的勇气.但是为了实现自我价值,履行自我的承诺,这就是责任.没有什么难不难,晚不晚之说,是我经常对别人说的那样,再晚不过心晚,,一切努力了,实现了每一天的 ...

  9. c# int uint32_C#中Int32和UInt32之间的区别

    c# int uint32 C#Int32和C#UInt32 (C# Int32 and C# UInt32) In C#, Int32 known as a signed integer of 4 ...

  10. angularjs 中 Factory,Service,Provider 之间的区别

    本片文章是使用了 angularjs 中使用 service 在controller 之间 share 对象和数据 的code(http://jsfiddle.net/kn46u0uj/1/) 来进行 ...

最新文章

  1. 【C++】容器与继承
  2. UITableViewCell 左侧滑动删除按钮 添加图片 (不完美解决)
  3. request和response的setCharacterEncoding()方法
  4. Semi-Supervised Classification with Graph Convolutional Networks
  5. JSON.stringify()方法
  6. 面向连接和无连接的套接字到底有什么区别?
  7. GitHub 的前世今生
  8. 图片压缩工具optipng/jpegoptim安装
  9. JavaScript关于json的处理
  10. 华为周跃峰:揭秘“关于GaussDB数据库的五大谎言”
  11. c语言利用线程交替打印奇偶数,两个线程交替打印奇偶数
  12. 嵌入式操作系统内核原理和开发(消息队列)
  13. 各种小巧的Hello World
  14. 华为智慧屏鸿蒙系统怎么样,鸿蒙系统初体验,华为智慧屏V65到底值不值得入手?...
  15. 移动应用框架 Ionic 4 Ionic for Everyone
  16. 风变Python8编程时,两大思维模式
  17. ex10_8金融应用:货币单位
  18. 进击的开发者!第二期SWTC社区开发者大赛拉开序幕
  19. 移动硬盘使用什么文件系统格式
  20. 开了店铺没访客没流量?Shopee店铺日常运营引流方式来啦

热门文章

  1. 【Java程序设计】多线程基础
  2. java 正则表达式案例
  3. [NOI2017]整数
  4. Spring源码解析(五)——自定义标签解析
  5. centos5安装PHP5时遇到问题
  6. Git--分布式版本控制系统
  7. server2008R2WSUS管理之 计算机管理
  8. 转:vs2012远程调试功能的改进
  9. 怎么才能取消和实现XP/windows 7自动登陆
  10. FTT字体绘制,2D阶段