在本文之前有2篇介绍Ref和Out的文章,同学看后提出了以下问题
public static void ValueParam(string str)
{
str = "251";
}
public static void RefParam(ref string str)
{
str = "250";
}
public static void Main()
{
string str = "249";
ValueParam(str);
Console.WriteLine(" Value Param:"+str);
RefParam(ref str);
Console.WriteLine(" Ref Param:"+str);
}
结果为:
Value Param:249 //这里结果为249和下面程序的b我就混淆搞不清楚了
Ref Param:250 //250我能理解
------------------------------------------------------------
public class MyClass
{
public static void TestRef(ref char i)
{
i = 'b ';
}
public static void TestNoRef(char i)
{
i = 'c ';
}
public static void Main()
{
char i = 'a ';
TestRef(ref i);
Console.WriteLine(i);
TestNoRef(i);
Console.WriteLine(i);
}
}
大家很容易看出输出结果是:
b //我也能理解
b //这里用的是TestNoRef(i)为什么输出也是b呢?如果按上一个程序的思想结果应该是a才是啊
==================================================================================
之所以出现上面的问题我想他是对C#的值传递和引用传递没有很好的搞清楚。
ref就是传递了引用,所以修改会被保存下来
或者说
by ref 就是将参数的指针传给函数, 结果就是参数会被函数修改并且保存下来,影响下面要使用这参数的值
by val 就是传一个值的copy , 原参数在这次使用后不会被修改。讲到这我想大家应该可以明白了
程序部分讲解如下:
string str = "249"; //str="249"
ValueParam(str); //str="249",因为是by value的,所以str的引用不变,str的引用的还是之前的"249"对象
Console.WriteLine(" Value Param:"+str); //str="249"
RefParam(ref str); //str="250",因为是by ref的,所以str的引用修改变成引用"250"对象
Console.WriteLine(" Ref Param:"+str); //str="250"
char i = 'a '; //i= 'a '
TestRef(ref i); //i= 'b ',因为是by ref的,所以i的值修改了
Console.WriteLine(i); //i= 'b '
TestNoRef(i); //i= 'b ',因为是by value的,所以i不变,i的值还是之前的 'b '
Console.WriteLine(i); //i= 'b '