博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
引用类型参数,ref按引用传值
阅读量:7044 次
发布时间:2019-06-28

本文共 1534 字,大约阅读时间需要 5 分钟。

在C#中,当参数是引用类型并且是以传值的方式传入参数的时候(没有加ref关键字),方法传入的是这个对象的引用的一个副本,相当于是以一个引用的值按照传值的方式调用方法,这个引用在方法内部会生成一个副本,就像普通的值类型变量一样,但是由于这个引用的副本和原来方法外面的类型的引用是指向了同一个对象,所以在方法内部对这个对象进行的各种操作(改变对象的属性等)看上去就像是按引用传递变量了一样,返回之后对象会发生变化。但是如果在方法内部对这个引用的副本进行了赋值操作,那么这个引用的副本就不再指向原来的对象了,方法返回后,原来的对象自然也不会发生变化。

结论:在C#的方法调用中,传入引用类型做参数而没有加ref关键字的时候,它仍然是以值传递的方式传递参数的,只不过传入方法内部的是对象的引用的值。
具体下面的代码

 
  1. StringBuilder s1 = new StringBuilder(); 
  2. StringBuilder s2 = new StringBuilder(); 
  3. operatorstring(s1, s2); 
  4. void operatorstring(StringBuilder sb1, StringBuilder sb2) 

对sb1和sb2的操作会反应在s1和s2的值上面。但是当sb1或者sb2的引用转向其地方,则和s1,s2的值脱离干系了。

 
  1. static void Main(string[] args) 
  2.         { 
  3.             StringBuilder s1 = new StringBuilder("a"); 
  4.             StringBuilder s2 = new StringBuilder("b"); 
  5.             operatorstring(s1, s2); 
  6.             Console.WriteLine(s1.ToString() + "," + s2.ToString()); 
  7.         } 
  8.         static void operatorstring(StringBuilder sb1, StringBuilder sb2) 
  9.         { 
  10.             sb1.Append("c"); 
  11.             //sb2 = new StringBuilder(); 
  12.             sb2.Append("c"); 
  13.          } 

此代码打印出ab,ac
但当去掉注释,变成

 
  1. static void operatorstring(StringBuilder sb1, StringBuilder sb2) 
  2.         { 
  3.             sb1.Append("c"); 
  4.             sb2 = new StringBuilder(); 
  5.             sb2.Append("c"); 
  6.          } 

则打印出ac,b。

要真正的传递引用,则要使用ref关键字

 
  1. [STAThread] 
  2.         static void Main(string[] args) 
  3.         { 
  4.             StringBuilder s1 = new StringBuilder("a"); 
  5.             StringBuilder s2 = new StringBuilder("b"); 
  6.             operatorstring(s1, ref s2); 
  7.             Console.WriteLine(s1.ToString() + "," + s2.ToString()); 
  8.         } 
  9.  
  10.         static void operatorstring(StringBuilder sb1, ref StringBuilder sb2) 
  11.         { 
  12.             sb1.Append("c"); 
  13.             sb2 = new StringBuilder(); 
  14.             sb2.Append("c"); 
  15.         } 

此代码打印出ac,c

 

本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/554400,如需转载请自行联系原作者

你可能感兴趣的文章
业内人士驳《我为什么自建机房?》:看似省钱其实未必
查看>>
Zookeeper介绍(28)
查看>>
使用POI读写word docx文件【docx总结的不错】
查看>>
Tomcat Server.xml配置文件
查看>>
ByteArrayOutputStream的用法
查看>>
项目经验总结-Eclipse图表工具Birt的使用技巧(三)
查看>>
使用fontawesome代替icon小图标
查看>>
监控平台bosun快速入门
查看>>
mysql (ab复制 mysql中间件)
查看>>
单点登录
查看>>
JS 实现复制到剪切板
查看>>
Linux TCP/IP协议栈分析
查看>>
PHP版单点登陆实现方案
查看>>
PHP记录日志的正确姿势(linux下适用)
查看>>
JavaScript 、Python Java、Go算法系列之【快速排序】篇
查看>>
在mac上实践jni
查看>>
PHP特级课视频教程_第三十六集 Mongodb与php开发结合_李强强
查看>>
PHP命名空间(Namespace)初探
查看>>
Dockerfile的常用语法
查看>>
C/C++ 编程有哪些值得推荐的辅助工具
查看>>