日期:2014-05-18  浏览次数:20809 次

ref问题,请讲解
麻烦各位帮我看一下下面2个程序,我对ref输出结果有点混淆了 请多指点
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才是啊


到底是网上的程序错了还是我的理解错了呢


------解决方案--------------------
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'
------解决方案--------------------
上面很详细了

by ref 就是将参数的指针传给函数, 结果就是参数会被函数修改
by val 就是传一个值的copy , 原参数不会被修改。
------解决方案--------------------
ref就是传递了引用,所以修改会被保存下来