引用类型参数,ref按引用传值

C#中的值传递与引用传递
本文通过实例讲解了C#中值类型与引用类型参数传递的区别,特别是当引用类型参数以值传递方式进行传递时的行为特点,并展示了如何正确使用ref关键字实现真正的引用传递。

在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,如需转载请自行联系原作者





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值