1. C#语言中,参数的传递有两种,一种是值传递,一种是引用传递。ref与out这两种方式都属于引用传递,只是他们的用法稍有不同。下面看几个例子
  2.  
  3. 使用ref的例子
  4.  
  5. class test
  6. {
  7. static void gump(int i)
  8. {
  9.  
  10. i=12;
  11.  
  12. i += 1;
  13. }
  14.  
  15. static void Main()
  16. {
  17. int i = 10;
  18. gump(i);
  19. Console.WriteLine(i);
  20. }
  21. }
  22.  
  23. 输出结果为:10
  24.  
  25. 再看
  26.  
  27. class test
  28. {
  29. static void gump(ref int i)
  30. {
  31.  
  32. i=12; //这个可以不赋值,也不会报错
  33. i += 1;
  34. }
  35.  
  36. static void Main()
  37. {
  38. int i = 10;
  39. gump(ref i);
  40. Console.WriteLine(i);
  41. }
  42. }
  43.  
  44. 输出结果:11
  45.  
  46. 使用out的例子
  47.  
  48. class test
  49. {
  50. static void gump(out int i)
  51. {
  52.  
  53. i=12; //必须对i初始化,否则会报错。 (这块就是ref和out的区别之一)
  54. i += 1;
  55. }
  56.  
  57. static void Main()
  58. {
  59. int i = 10;
  60. gump(out i);
  61. Console.WriteLine(i);
  62. }
  63. }
  64.  
  65. 当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。
  66.  
  67. 下面来举例说明一下out 的用法
  68.  
  69. 示例:
  70.  
  71. class gump
  72. {
  73. public void math_routines(double x, out double half, out double squared, out double cubed)
  74. {
  75. half = x / 2; //必须初始化,否则会报错
  76. squared = x * x; //必须初始化,否则会报错
  77. cubed = x * x * x; //必须初始化,否则会报错
  78.  
  79. }
  80. }
  81. class TestApp
  82. {
  83. public static void Main()
  84. {
  85. gump g = new gump();
  86. double x1 = 60;
  87. double half1 = 0;
  88. double squared1 = 0;
  89. double cubed1 = 0;
  90.  
  91. Console.WriteLine("Before method->x1={0},half1={1},squared1={2},cubed1={3}", x1,half1 ,squared1,cubed1);
  92.  
  93. g.math_routines(x1, out half1, out squared1, out cubed1);
  94. Console.WriteLine("After method->x1={0},half1={1},squared1={2},cubed1={3}", x1, half1, squared1, cubed1);
  95.  
  96. }
  97.  
  98. }
  99.  
  100. ref用法示例:
  101.  
  102. class gump
  103. {
  104. public double square(ref double x)
  105. {
  106. x *= x; //可以不初始化,不会报错
  107. return x;
  108. }
  109. }
  110.  
  111. class Program
  112. {
  113. static void Main(string[] args)
  114. {
  115. gump g = new gump();
  116. double a = 3;
  117. double b = 5;
  118. Console.WriteLine("Before square->a={0},b={1}", a, b);
  119.  
  120. a = g.square(ref a);
  121. Console.WriteLine("After square->a={0},b={1}", a, b);
  122. }
  123. }
  124.  
  125. 从上面的例子可以看出:
  126.  
  127. ref必须先初始化才能完成引用。out是内部为外部赋值,所以不需要初始化。
  128.  
  129. ref是内部对外部的值进行改变,而out则是内部为外部变量赋值。可以返回多个值。

  

ref 和out的区别的更多相关文章

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

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

  2. ref和out的区别?

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

  3. ref和out的区别

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

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

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

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

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

  6. 关于ref与out的区别

    写在最前面 这几天一直在公司接受培训,都是一些基础的知识,同时也乘着这个机会巩固一下自己的基础,基础太重要了.前些时一直看的是多线程方面的知识,接下来我会写一些其他方面的知识,毕竟作为一个实习新人得和 ...

  7. C#中ref和out的区别浅析

    这篇文章主要介绍了C#中ref和out的区别浅析,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢,需要的朋友可以参考下   在C#中通过使用方法来获取返回值时,通 ...

  8. 参数修饰符ref,out ,params的区别

    参数修饰符ref,out ,params的区别 C#中有三个关键字-ref,out ,params,可是这三个之间的区别你都明白了吗? 那么我们就来认识一下参数修饰符ref,out ,params吧, ...

  9. ref与out的区别、冒泡排序、普通排序,以及二分法查询

    一.首先我们先讲一下ref与out的区别和使用方法: 1.ref与out的区别: out:需要在使用前声明变量,分配地址但不能赋值,但是需要在使用中的时候需要初始化(进入方法体中的时候需要先赋值在使用 ...

  10. Spring框架xml配置中属性ref与value的区别

    1.spring批量扫描mybatis的mapper,使用value 2.spring管理mybatis的单个mapper,用的是ref 虽然引用的是同一个bean,但两个对象的属相类型明显不一样,一 ...

随机推荐

  1. Python 爬虫爬取今日头条街拍上的图片

    # 今日头条--街拍 import requests from urllib.parse import urlencode import os from hashlib import md5 from ...

  2. 获取最新ADT下载地址的方法

    最近网络不给力,谷歌上不去,想下个最新的ADT插件也难,于是寻找方法,最后找到一个不错的方法,问题解决过程如下(别嫌我啰嗦啊). 网上有人分享过下载ADT插件的页面地址:install-adt.htm ...

  3. 大数低速幂运算模板(c++)+python大数幂

    简介 自己从大数加法改过来的模板,低速计算n的t次幂,n,t小于等于100速度能够保证 模板 #include <bits/stdc++.h> using namespace std; s ...

  4. linux less-分屏上下翻页浏览文件内容

    博主推荐:获取更多 linux文件内容查看命令 收藏:linux命令大全 less命令的作用与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而more ...

  5. 【Python实践-8】和为S的两个数字

    (剑指offer)输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 思路:选定第一个数字,然后遍历后面的数字求和并与S比 ...

  6. session 与 cookie 区别-----https://segmentfault.com/a/1190000013447750?utm_source=tag-newest

    cookie数据存放在客户的浏览器上,session数据放在服务器上. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session. sessi ...

  7. 47. Spring Boot发送邮件【从零开始学Spring Boot】

    (提供源代码) Spring提供了非常好用的JavaMailSender接口实现邮件发送.在Spring Boot的Starter模块中也为此提供了自动化配置.下面通过实例看看如何在Spring Bo ...

  8. POJ 3630

    Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20894 Accepted: 6532 Descripti ...

  9. [K/3Cloud]DBServiceHelper.ExecuteDataSet(this.Context, sql)) 返回数据问题

    例如下面代码: int sQty = 0; string sql = string.Format(@" Select FMATERIALID ,FBASEUNITID ,FAUXPROPID ...

  10. [USACO 4.2] 完美的牛栏

    ★★☆   输入文件:stall4.in   输出文件:stall4.out   简单对比 时间限制:1 s   内存限制:128 MB USACO/stall4(译by Felicia Crazy) ...