C#形参和实参、引用类型和值类型使用时的一个注意点。

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

 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值