引用类型参数,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,如需转载请自行联系原作者





相关文章
|
6月前
|
编译器 C++
C++ 解引用与函数基础:内存地址、调用方法及声明
C++ 中的解引用允许通过指针访问变量值。使用 `*` 运算符可解引用指针并修改原始变量。注意确保指针有效且不为空,以防止程序崩溃。函数是封装代码的单元,用于执行特定任务。理解函数的声明、定义、参数和返回值是关键。函数重载允许同一名称但不同参数列表的函数存在。关注公众号 `Let us Coding` 获取更多内容。
181 1
|
6月前
|
安全 编译器 C语言
深入了解C++:形参、内联、重载、引用、const和指针、new和delete
深入了解C++:形参、内联、重载、引用、const和指针、new和delete
39 1
方法引用符、引用类方法、引用对象的实例方法、引用类的实例方法及引用构造器
方法引用符、引用类方法、引用对象的实例方法、引用类的实例方法及引用构造器
91 0
|
存储 Unix PHP
变量的引用赋值与传值赋值
一、使用 memory_get_usage() 查看PHP内存使用量 1. 传值赋值
 变量的引用赋值与传值赋值
|
安全 编译器 C++
【C++基础】引用的用法、const常量引用
作用:给变量起别名,新别名指向的是同一块内存。 语法:数据类型 &别名 = 原名
223 0
【C++基础】引用的用法、const常量引用
|
Java 编译器
方法引用的那些事儿
一句话介绍: > **方法引用**(**_Method Reference_**)是在 Lambda 表达式的基础上引申出来的一个功能。 先不铺展概念,从一个示例开始说起。 # 一、小示例 ```java List list = Arrays.asList(1, 2, 3); list.forEach(num -> System.out.println(num));
450 0
|
Java
方法引用和构造器引用
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hanniel/article/details/81877750 1.
678 0
|
C++ Java
03.引用的使用和函数
(创建于2017/12/24) #include #include using namespace std; /* 引用: 1.单纯给变量去别名,没有任何意义,作为函数参数传递过程中不产生副本, 2.
789 0