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

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

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

出处:
 
在C#中,当参数是引用类型并且是以传值的方式传入参数的时候(没有加ref关键字),方法传入的是 这个对象的引用的一个副本,相当于是 以一个引用的值按照传值的方式调用方法,这个引用在方法内部会生成一个副本,就像普通的值类型变量一样,但是由于这个引用的副本和原来方法外面的类型的引用是指向了同一个对象,所以在方法内部对这个对象进行的各种操作(改变对象的属性等)看上去就像是按引用传递变量了一样,返回之后对象会发生变化。但是如果在方法内部对这个引用的副本进行了赋值操作,那么这个引用的副本就不再指向原来的对象了,方法返回后,原来的对象自然也不会发生变化。
结论:在C#的方法调用中,传入引用类型做参数而没有加ref关键字的时候,它仍然是以值传递的方式传递参数的,只不过传入方法内部的是对象的引用的值。
具体下面的代码
StringBuilder s1 = new StringBuilder();
StringBuilder s2 = new StringBuilder();
operatorstring(s1, s2);
void operatorstring(StringBuilder sb1, StringBuilder sb2)

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

static void Main(string[] args)
{
StringBuilder s1 = new StringBuilder("a");
StringBuilder s2 = new StringBuilder("b");
operatorstring(s1, s2);
Console.WriteLine(s1.ToString() + "," + s2.ToString());
}
static void operatorstring(StringBuilder sb1, StringBuilder sb2)
{
sb1.Append("c");
//sb2 = new StringBuilder();
sb2.Append("c");
}
此代码打印出ab,ac
但当去掉注释,变成
static void operatorstring(StringBuilder sb1, StringBuilder sb2)
{
sb1.Append("c");
sb2 = new StringBuilder();
sb2.Append("c");
}
则打印出ac,b。

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

[STAThread]
static void Main(string[] args)
{
StringBuilder s1 = new StringBuilder("a");
StringBuilder s2 = new StringBuilder("b");
operatorstring(s1, ref s2);
Console.WriteLine(s1.ToString() + "," + s2.ToString());
}

static void operatorstring(StringBuilder sb1, ref StringBuilder sb2)

{
sb1.Append("c");
sb2 = new StringBuilder();
sb2.Append("c");
}
此代码打印出ac,c

转载于:https://www.cnblogs.com/simbadan/archive/2012/10/16/2725725.html

你可能感兴趣的文章
初识python
查看>>
Jsoncpp 使用方法解析
查看>>
后台写的分页
查看>>
第1次java1作业
查看>>
Spring配置声明
查看>>
web.config配置
查看>>
Matlab随笔之矩阵入门知识
查看>>
线程范围内的数据共享
查看>>
css 背景样式学习
查看>>
oracle执行计划连接方式
查看>>
机器学习 决策树 ID3
查看>>
Cmake
查看>>
vue 之 nextTick 与$nextTick
查看>>
JavaScript中的加法运算
查看>>
JS设计模式——3.封装与信息隐藏
查看>>
git-- 使用
查看>>
Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo
查看>>
delphi对窗体的查询(delphi xe2)
查看>>
Ajax跨域:Jsonp原理解析
查看>>
hdu 5099 Comparison of Android versions 枚举题意
查看>>