当前位置: 首页 > news >正文

C#基础:值类型、引用类型与ref关键字

在C#中,ref的意思是按引用传递。可以参考C++:

view plaincopy to clipboardprint?
  1. int a = 10, b = 20;   
  2. void swap(int x, int y)   
  3. {   
  4.     int temp = x;   
  5.     x = y;   
  6.     y = temp;   
  7. }  

如果简单的调用这个swap,比如:swap(a, b),那么你根本没办法交换这两个变量的值,因为x和y都是形参,在swap返回的时候,x和y都被释放了。但如果是这样定义swap:

view plaincopy to clipboardprint?
  1. void swap (int& x, int& y)   
  2. {   
  3.     int temp = x;   
  4.     x = y;   
  5.     y = temp;   
  6. }  

 

也就相当于x与a,y与b指向同一个内存地址,那么对x的操作也就相当于对a的操作。那么在C#里面,这种效果对于值类型是很明显的。

view plaincopy to clipboardprint?
  1. class Program   
  2. {   
  3.     static void Test(ref int b)   
  4.     {   
  5.         b = 2;   
  6.     }   
  7.   
  8.     static void Main(string[] args)   
  9.     {   
  10.         int b = 1;   
  11.         Test(ref b);   
  12.         Console.WriteLine(b);   
  13.     }   
  14. }   

此时的输出是2,也就是Test方法中的b与Main中的b指向同一个内存地址,那么对Test.b的操作也就是对Main.b的操作。你如果把程序改成:

view plaincopy to clipboardprint?
  1. class Program   
  2. {   
  3.     static void Test(int b)   
  4.     {   
  5.         b = 2;   
  6.     }   
  7.   
  8.     static void Main(string[] args)   
  9.     {   
  10.         int b = 1;   
  11.         Test(b);   
  12.         Console.WriteLine(b);   
  13.     }   
  14. }   

 

那么输出的还是1,因为Test.b不是Main.b的引用,也就是一个单独的形参。现在再看对于引用类型,会是什么效果:

view plaincopy to clipboardprint?
  1. class TestClass   
  2. {   
  3.     public int b;   
  4. }   
  5.   
  6. class Program   
  7. {   
  8.     static void Test(TestClass b)   
  9.     {   
  10.         b.b = 2;   
  11.     }   
  12.   
  13.     static void Main(string[] args)   
  14.     {   
  15.         TestClass b = new TestClass();   
  16.         b.b = 1;   
  17.         Test(b);   
  18.         Console.WriteLine(b.b);   
  19.     }   
  20. }   

上面的代码,输出的是2,因为b是引用类型,在只需修改b的成员的时候,加不加ref关键字都一样。引用类型本身并不包含数据,仅仅维持了对数据的引用。

因此,使用ref参数,对值类型对象的作用显而易见,而对于引用类型,如需修改引用类型内部的数据,则无需使用ref关键字;否则,当被调用函数内部需要更改引用本身时,比如在函数内部重新定位对象的引用,则需要使用ref关键字。

相关文章:

  • 纬衡新一代图档技术在保利地产的应用
  • 专业一点,更专业一点
  • 单臂路由
  • 屏幕任意点颜色拾取
  • 明天就要参加第三届D2论坛了
  • 一步一步搭建免费的Silverlight 2开发环境
  • Web发展史上十件大事:Linux、Firefox入选
  • linux服务器配置实例1---Linux网络基础
  • 消息来时让网页标题闪动
  • 随便写一点
  • [转贴]关于单位内部实施ITSM一般性服务台模型的思考
  • 记号
  • iptraf网络监控
  • 网路管理
  • Centos下***(pptpd)的部署
  • Bootstrap JS插件Alert源码分析
  • ES6之路之模块详解
  • IndexedDB
  • Java精华积累:初学者都应该搞懂的问题
  • java正则表式的使用
  • JS题目及答案整理
  • linux安装openssl、swoole等扩展的具体步骤
  • Lucene解析 - 基本概念
  • PaddlePaddle-GitHub的正确打开姿势
  • Python3爬取英雄联盟英雄皮肤大图
  • QQ浏览器x5内核的兼容性问题
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Wamp集成环境 添加PHP的新版本
  • 阿里云购买磁盘后挂载
  • 复杂数据处理
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 使用parted解决大于2T的磁盘分区
  • 手机app有了短信验证码还有没必要有图片验证码?
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​卜东波研究员:高观点下的少儿计算思维
  • #Z0458. 树的中心2
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $.ajax()参数及用法
  • $.ajax()方法详解
  • (2015)JS ES6 必知的十个 特性
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (pytorch进阶之路)扩散概率模型
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (转)iOS字体
  • (转)四层和七层负载均衡的区别
  • ./configure,make,make install的作用(转)
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET开发不可不知、不可不用的辅助类(一)
  • :中兴通讯为何成功
  • @AutoConfigurationPackage的使用
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @PreAuthorize注解
  • []Telit UC864E 拨号上网
  • [100天算法】-实现 strStr()(day 52)