巧妙理解方法的值参数与引用参数
方法的传值与传地址一直是困扰很多初学者的问题,下面有一种容易理解的方法,先看下面的程序:
class Program
{
static void SwapValue(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
static void Main(string[] args)
{
int a = 100;
int b = 10;
Console.WriteLine("执行传值函数前a={0},b={1}",a,b);
SwapValue(a, b);
Console.WriteLine("执行传值函数后a={0},b={1}", a, b);
Console.ReadLine();
}
}
运行的结果为:
可见,调用方法SwapValue(int a,int b) 后,实参a,b的值并没有改变.
参数可以通过引用或值传递给方法。在变量通过引用传递给方法时,被调用的方法得到的就是这个变量,所以在方法内部对变量进行的任何改变在方法退出后仍旧发挥作用。而如果变量是通过值传送给方法的,被调用的方法得到的是变量的一个副本,也就是说,在方法退出后,对变量进行的修改会丢失。对于复杂的数据类型,按引用传递的效率更高,因为在按值传递时,必须复制大量的数据。
现在举例便于理解:
建立两个文件夹 SwapValue和Main
在Main文件夹中建立两个文本文件a和b,存放的类容分别是100和10
由于如果变量是通过值传送给方法的,被调用的方法得到的是变量的一个副本,也就是说复制了一份,那么,把刚才Main文件夹下面的a和b两个文件都复制到SwapValue文件夹下面
然后把文件a的类容改为10,文件b的类容改为100,这类似方法的值传递,改变数值是在复制的副本上进行更改的,显然Main文件夹的类容不会改变.
再看看传引用参数的程序示例:
class Program
{
static void SwapRef(ref int a,ref int b)
{
int temp = a;
a = b;
b = temp;
}
static void Main(string[] args)
{
int a = 100;
int b = 10;
Console.WriteLine("执行传址函数前a={0},b={1}",a,b);
SwapRef(ref a,ref b);
Console.WriteLine("执行传址函数后a={0},b={1}", a,b);
Console.ReadLine();
}
}
运行结果为:
结果a和b的值互换了.
通过值传送变量是默认的,也可以迫使值参数通过引用传送给方法。为此,要使用ref关键字。如果把一个参数传递给方法,且这个方法的输入参数前带有ref关键字,则该方法对变量所作的任何改变都会影响原来对象的值.
举例如下,另外建立一个文件夹SwapRef
在SwapRef文件夹下面建立两个快捷方式,分别指向Main文件夹中的a和b 文件
然后把SwapRef 文件夹下面的a 文件类容改为10,b文件类容改为100保存,再打开Main
下面的a文件,发现类容改了,成来了10,b类容也改了,成了100.
快捷方式其实就是指向原文件的地址的引用,它和原文件共用一块区域.
这与引用参数有相似之处,引用参数并不创建新的存储单元,它与方法调用中的实在参数变量同处一个存储单元,因此,再方法内对形参的修改就是对外部实参变量的修改.
这样就容易理解多了吧.