读CLR via C#总结(7) 以传引用的方式向方法传递参数---refout
默认情况下,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相关推荐
- ajax post请求怎么传参_ajax用post方法传递参数
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 JS #box{ width:600px; height:200px; padding:20px; border:1px solid #999; } aj ...
- php 小程序页面传参,介绍小程序中传递参数的实现方法
这篇文章主要介绍了微信小程序 参数传递详解的相关资料,需要的朋友可以参考下 微信小程序的推出,无疑将会在移动互联网行业里再次掀起风浪. 有人会质疑小程序会不会火, 会不会火我不知道, 看微信的用户量即 ...
- html点击事件传参 php,HTML通过事件传递参数到js详解及实例
目标处理函数为selectAttr(test) 1.直接传递给定参数如:οnclick="selectAttr('1'); οnclick="selectAttr('a'); 2. ...
- php怎么给接口里的方法传参,PHP接口中方法的参数和实现类方法中的参数可以不一致的问题...
interface Dispatch2 { public function getController(); } class QueryString implements Dispatch2 { pu ...
- Android10apk怎么传数据,Android不同apk之间传递参数与数据
转载出处:http://dongyang555-126-com.iteye.com/blog/1308586 android编程的时候,有时候需要在不同的apk之间传递参数或数据,下面是一个简单的例子 ...
- java http post 传参数_http post 方法传递参数的2种方式
1.StringEntity try{ HttpPost httpPost = new HttpPost(url); //param参数,可以为param="key1=value1& ...
- 跟小静读CLR via C#(10)-参数
最近几天学了参数,其实对于参数本不陌生,从上学学C语言基础的时候就学过了.不过细心学下来,还是收获了一些. 一. 命名参数.可选参数 命名参数和可选参数是在Visual C#2010中引入的新特性. ...
- 引用和指针的区别?传引用比传指针安全,为什么?如果我使用常量指针难道不行吗?
引用和指针的区别 (1) 引用在创建的同时必须初始化,即引用到一个有效的对象:而指针在定义的时候不必初始化,可以在定义后面的任何地方重新赋值. (2) 不存在NULL引用,引用必须与合法的存储单元关联 ...
- JavaScript 是传值调用还是传引用调用?
1. 例子 先来看两个个来自于 <JavaScript 高级程序设计>P70-P71 的两个例子. 1.1. 基本类型参数传递 function addTen(num) {num += 1 ...
最新文章
- ThinkPHP控制器
- Leetcode 921. Minimum Add to Make Parentheses Valid
- Tableau研学小课堂(part3)--Tableau数据可视化
- GDB 修改当前判断函数的返回值(即修改寄存器的值)的方法
- 微信小程序入门四: 导航栏样式、tabBar导航栏
- [js] 请使用 js 实现一个双向链表
- C#.NET学习笔记2---C#.第一个C#程序
- React和Vue的模块化
- python面向对象编程指南 脚本之家_Python面向对象编程之继承与多态详解
- [转载] python中bool啥意思_Python中的bool类型
- SQL:where 和 having 的区别
- 小波分解与小波包分解的区别
- 为激励英特尔建厂 美国俄亥俄州拿出20亿美元优惠政策
- 成长了,记录一下,增值税发票识别写入excel文件里
- 一个简单的python爬虫程序
- Hanselminutes播客55-MonoRail作为替代ASP.NET
- 香帅的北大金融学课笔记20 -- 金融术与道
- 自定义数据字典工具类
- ubuntu 9.10下的网络电视sopcast的安装及消除播放杂音
- 使用tushare筛选某一天的ST股票
热门文章
- TCP/IP学习笔记(六)Nagle算法
- java网络编程与分布式计算_Java_net Java网络编程与分布式计算 - 下载 - 搜珍网
- mysql导出数据意义_导出数据库的意义
- Windows下MongoDB安装及配置
- 解决Win7英文版显示中文乱码
- 牛客contest897 D-Bamboo Rat(二分+黑白染色+最小割)
- HDU 1729(石子)
- 2262: master(vector + dfs)
- 关于LeTax中图形放置的参数理解
- $_post 数据上传到那个位置_如何实现图片上传并保存到数据库?