结论:在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