巧妙理解方法的值参数与引用参数

巧妙理解方法的值参数与引用参数

方法的传值与传地址一直是困扰很多初学者的问题,下面有一种容易理解的方法,先看下面的程序:

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的值并没有改变.

参数可以通过引用或值传递给方法。在变量通过引用传递给方法时,被调用的方法得到的就是这个变量,所以在方法内部对变量进行的任何改变在方法退出后仍旧发挥作用。而如果变量是通过值传送给方法的,被调用的方法得到的是变量的一个副本,也就是说,在方法退出后,对变量进行的修改会丢失。对于复杂的数据类型,按引用传递的效率更高,因为在按值传递时,必须复制大量的数据。

 

现在举例便于理解:

 

建立两个文件夹 SwapValueMain

Main文件夹中建立两个文本文件ab,存放的类容分别是10010

 

由于如果变量是通过值传送给方法的,被调用的方法得到的是变量的一个副本,也就是说复制了一份,那么,把刚才Main文件夹下面的ab两个文件都复制到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();

        }

    }

运行结果为:

结果ab的值互换了.

通过值传送变量是默认的,也可以迫使值参数通过引用传送给方法。为此,要使用ref关键字。如果把一个参数传递给方法,且这个方法的输入参数前带有ref关键字,则该方法对变量所作的任何改变都会影响原来对象的值.

举例如下,另外建立一个文件夹SwapRef

SwapRef文件夹下面建立两个快捷方式,分别指向Main文件夹中的ab 文件

然后把SwapRef 文件夹下面的a 文件类容改为10,b文件类容改为100保存,再打开Main

下面的a文件,发现类容改了,成来了10,b类容也改了,成了100.

快捷方式其实就是指向原文件的地址的引用,它和原文件共用一块区域.

这与引用参数有相似之处,引用参数并不创建新的存储单元,它与方法调用中的实在参数变量同处一个存储单元,因此,再方法内对形参的修改就是对外部实参变量的修改.

这样就容易理解多了吧.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值