今天试了个简单的程序:
class MainProg
{
public static void Main()
{
MainProg man = new MainProg();
int x= 1;
System.Console.WriteLine("x的初始值是:{0}",x);
man.AddFive(x);
System.Console.WriteLine("After AddFive:{0}",x);
man.AddFiveRef(ref x);
System.Console.WriteLine("After AddFiveRef:{0}",x);
man.AddFiveOut(out x);
System.Console.WriteLine("After AddFiveOut:{0}",x);
}
public void AddFive(int i)
{
i+=5;
}
public void AddFiveRef(ref int i)
{
i+= 5;
}
public void AddFiveOut(out int i)
{
i= 5;
}
}
运行结果为什么是这样的:
---------- Run C# Inside ----------
x的初始值是:1
After AddFive:1
After AddFiveRef:6
After AddFiveOut:5输出完成 (耗时: 2 秒) - 正常终止
为什么After AddFiveRef后的值是6而不是2?

解决方案 »

  1.   

    因为传入man.AddFive(x);的x,在函数中修改后,是不能反映到外层函数的。在AddFiveRef(ref x)后,x的值被函数修改后,反映到调用层。
    当一个值类型的参数传入函数后,怎么修改都不会影响调用层的。out的修饰符也差不多。
    建议细读一下msdn的相关描述。
    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_csref/html/b8a5e59c-907d-4065-b41d-95bf4273c0bd.htm说一下:
    int i=0;
    AddFive(i);
    // 这是i=0AddFiveRef(ref i);
    // i=函数付的值
    // i=888888;// 无论这个函数怎么复制,调用后i还是原来值。
    public void AddFive(int i)
    {
    i=99999999;
    }public void AddFiveRef(ref int i)
    {
    i=888888;
    }