博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#形参和实参、引用类型和值类型使用时的一个注意点。
阅读量:5999 次
发布时间:2019-06-20

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

这是早上群里讨论的例子。

1 static void main(string [] arg){ 2  3 var p1=new Person{Name="张三"}; 4 var p2=new Person{Name="李四"};   int i=0; 5 A1(p1,i); 6 A2(p2,ref i); 7 Console.WriteLine(p1.Name+"----"+i);//输出张三-----0 8 Console.WriteLine(p2.Name+"----"+i);//输出孙六-----1   9  } 10 11 void A1(Person ppp,int i){
      i++;12 ppp=new Person{Name="王五"};13 }14 void A2(Person ppp,ref int i){
      i++;15 ppp.Name="孙六";16 }

 

80%的老程序员在输出p1.Name时都错了,都以为是王五。一开始我也不理解。A1中引用类型的ppp改变了,为什么输出的还是“张三”?后来搜索资料明白了关键因素——【形参和实参是两个不同的变量!】

形参就是方法声明时的参数。如void A1(string ppp)的ppp。

实参就是调用方法时传递的参数。如A1(p1)的p1。

百度知道里一位大牛的总结:

【函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。】
因为A1方法里,ppp=new Person{Name="王五"};的操作把形参ppp地址改变了,不在是p1的引用地址。所以导致无法对实参p1产生影响。
对比A2。ppp和p2的引用地址始终一样。所以对p1一直有影响。

说道这里我们在扩展一下C#中out和ref 两种参数的修饰。

...敬请期待

转载于:https://www.cnblogs.com/MLGB/p/4210876.html

你可能感兴趣的文章
使用Zipkin和Brave 实现dubbo服务调用跟踪
查看>>
Crossbar技术冲破网络容量瓶颈
查看>>
【IT基础】让你的网站留住用户
查看>>
Mac outlook2011 无法拒绝会议邀请
查看>>
红与黑
查看>>
linux命令速查
查看>>
Spring+Tomcat的JNDI数据源连接池简单配置
查看>>
Gradle 1.12用户指南翻译——第四十九章. Build Dashboard 插件
查看>>
struts中采用注解配置Action
查看>>
SecureCRT 安装上传(rz)和下载(sz)
查看>>
Rsync配置参数详解-什么是Rsync
查看>>
Android2.2 API 中文文档系列(1) —— TextView
查看>>
如何对磁盘做完整的全盘镜像备份?
查看>>
我的TiddlyWiki
查看>>
python学习:读写文件和字典排序
查看>>
Git学习笔记
查看>>
网络安全系列之三十七 Pangolin(穿山甲)和Havij(胡萝卜)的使用
查看>>
linux shell 将当前文件地址作为默认路径写入环境变量
查看>>
Apache CXF学习-创建基于spring的web service
查看>>
View Horizon Mirage安装手册(四)——Mirage Management Console安装
查看>>