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

一个C#引用函数的问题!
今天试了个简单的程序:
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?

------解决方案--------------------
因为传入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=0

AddFiveRef(ref i);
// i=函数付的值
// i=888888;

// 无论这个函数怎么复制,调用后i还是原来值。
public void AddFive(int i)
{
i=99999999;
}

public void AddFiveRef(ref int i)
{
i=888888;
}