默认情况下,CLR假定所有方法参数都是传值的。
  对于引用类型,对一个对象的引用(指向对象的一个指针)会传给方法,但是这个引用本身是以传值的方式传给方法的。方法能修改对象,调用者能看到这些修改。
  对于值类型,传给方法的是实例的一个副本。方法获得的是一个值类型实例副本,所以调用者中的实例不受影响
  代码如下:

namespace refDemo2
{class Program{static void Main(string[] args){int i = 5;AddI(i);Console.WriteLine(i);//显示"5",i的值并没有改变
            Console.ReadKey();}private static void AddI(int v)//v获得的是i的一个副本,调用者中的实例不受影响
        {v+= 10;}}
}

一,为值类型使用ref和out

namespace refDemo2
{class Program{static void Main(string[] args){int i = 5;AddI(ref i);Console.WriteLine(i);//显示"15",i的值被改变了
        Console.ReadKey();}private static void AddI(ref int v)//v获得的是一个指向实例对象(值5)的指针
        {v+= 10;}}
}

二,为引用类型使用ref和out

namespace refDemo3
{class Program{static void Main(string[] args){string s1 = "Tmac";string s2 = "Mcgrady";Swap(s1,s2);//没有使用refConsole.WriteLine(s1);//显示"Tmac"Console.WriteLine(s2);//显示"Mcgrady",为什么值没有交换呢???
        }private static void Swap(string a, string b)//a和b获取的是一个分别指向对象s1和s2的指针
        {string t = b;b = a;a = t;}}
}

  容易困惑的地方:s1,s2是引用类型,传给方法Swap的肯定也是指向实例的一个指针,那理论上来讲调用了Swap方法之后s1和s2的值要交换呀,可是实际结果并不如我们所愿,这是为什么呢?
  答:就如文章一开头讲的,默认情况下,CLR假定所有方法参数都是传值的,虽然s1和s2是引用类型,调用方法时传递的也是指向实例的指针,但是,指针本身还是以传值方式传给方法的。所以调用者中实例的值并没有得到改变。

  要达到我们想要的效果,所以还是必须得使用ref,代码如下:

namespace refDemo3
{class Program{static void Main(string[] args){string s1 = "Tmac";string s2 = "Mcgrady";Swap(ref s1,ref s2);Console.WriteLine(s1);//显示"Mcgrady"Console.WriteLine(s2);//显示"Tmac"
        }private static void Swap(ref string a,ref string b)//a和b获取的是一个分别指向对象s1和s2的指针
        {string t = b;b = a;a = t;}}
}

总结:1,从IL和CLR的角度看,ref和out是一样的,它们都会生成相同的IL代码,都导致传递指向实例的一个指针。

   2,ref一般用在方法内部对外部的值进行改变的时候。而out一般用在方法有多个返回值的时候。

转载于:https://www.cnblogs.com/mcgrady/archive/2012/06/09/2433403.html

读CLR via C#总结(7) 以传引用的方式向方法传递参数---refout相关推荐

  1. ajax post请求怎么传参_ajax用post方法传递参数

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 JS #box{ width:600px; height:200px; padding:20px; border:1px solid #999; } aj ...

  2. php 小程序页面传参,介绍小程序中传递参数的实现方法

    这篇文章主要介绍了微信小程序 参数传递详解的相关资料,需要的朋友可以参考下 微信小程序的推出,无疑将会在移动互联网行业里再次掀起风浪. 有人会质疑小程序会不会火, 会不会火我不知道, 看微信的用户量即 ...

  3. html点击事件传参 php,HTML通过事件传递参数到js详解及实例

    目标处理函数为selectAttr(test) 1.直接传递给定参数如:οnclick="selectAttr('1'); οnclick="selectAttr('a'); 2. ...

  4. php怎么给接口里的方法传参,PHP接口中方法的参数和实现类方法中的参数可以不一致的问题...

    interface Dispatch2 { public function getController(); } class QueryString implements Dispatch2 { pu ...

  5. Android10apk怎么传数据,Android不同apk之间传递参数与数据

    转载出处:http://dongyang555-126-com.iteye.com/blog/1308586 android编程的时候,有时候需要在不同的apk之间传递参数或数据,下面是一个简单的例子 ...

  6. java http post 传参数_http post 方法传递参数的2种方式

    1.StringEntity try{ HttpPost httpPost = new HttpPost(url); //param参数,可以为param="key1=value1& ...

  7. 跟小静读CLR via C#(10)-参数

    最近几天学了参数,其实对于参数本不陌生,从上学学C语言基础的时候就学过了.不过细心学下来,还是收获了一些. 一. 命名参数.可选参数 命名参数和可选参数是在Visual C#2010中引入的新特性. ...

  8. 引用和指针的区别?传引用比传指针安全,为什么?如果我使用常量指针难道不行吗?

    引用和指针的区别 (1) 引用在创建的同时必须初始化,即引用到一个有效的对象:而指针在定义的时候不必初始化,可以在定义后面的任何地方重新赋值. (2) 不存在NULL引用,引用必须与合法的存储单元关联 ...

  9. JavaScript 是传值调用还是传引用调用?

    1. 例子 先来看两个个来自于 <JavaScript 高级程序设计>P70-P71 的两个例子. 1.1. 基本类型参数传递 function addTen(num) {num += 1 ...

最新文章

  1. ThinkPHP控制器
  2. Leetcode 921. Minimum Add to Make Parentheses Valid
  3. Tableau研学小课堂(part3)--Tableau数据可视化
  4. GDB 修改当前判断函数的返回值(即修改寄存器的值)的方法
  5. 微信小程序入门四: 导航栏样式、tabBar导航栏
  6. [js] 请使用 js 实现一个双向链表
  7. C#.NET学习笔记2---C#.第一个C#程序
  8. React和Vue的模块化
  9. python面向对象编程指南 脚本之家_Python面向对象编程之继承与多态详解
  10. [转载] python中bool啥意思_Python中的bool类型
  11. SQL:where 和 having 的区别
  12. 小波分解与小波包分解的区别
  13. 为激励英特尔建厂 美国俄亥俄州拿出20亿美元优惠政策
  14. 成长了,记录一下,增值税发票识别写入excel文件里
  15. 一个简单的python爬虫程序
  16. Hanselminutes播客55-MonoRail作为替代ASP.NET
  17. 香帅的北大金融学课笔记20 -- 金融术与道
  18. 自定义数据字典工具类
  19. ubuntu 9.10下的网络电视sopcast的安装及消除播放杂音
  20. 使用tushare筛选某一天的ST股票

热门文章

  1. TCP/IP学习笔记(六)Nagle算法
  2. java网络编程与分布式计算_Java_net Java网络编程与分布式计算 - 下载 - 搜珍网
  3. mysql导出数据意义_导出数据库的意义
  4. Windows下MongoDB安装及配置
  5. 解决Win7英文版显示中文乱码
  6. 牛客contest897 D-Bamboo Rat(二分+黑白染色+最小割)
  7. HDU 1729(石子)
  8. 2262: master(vector + dfs)
  9. 关于LeTax中图形放置的参数理解
  10. $_post 数据上传到那个位置_如何实现图片上传并保存到数据库?