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

方法的参数
书上说:传值参数在方法调用过程中如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此而改变,而是保留原来传入时的值。传址参数恰恰相反,如果方法调用过程改变了参数的值,那么传入方法的参数在调用完成以后也随之改变

using System;
class Test
{
    static void Swap(ref int x, ref int y) 
    {
        int temp = x;
        x = y;
        y = temp;
    }
    static void Swap(int x,int y) 
    {
        int temp = x;
        x = y;
        y = temp;
    }
    static void Main() 
    {
        int i = 1, j = 2;
        Swap(ref i, ref j);
        Console.WriteLine("i = {0}, j = {1}", i, j);
        Swap(i,j);
        Console.WriteLine("i = {0}, j = {1}", i, j);
    }


  程序经编译后执行输出: 

i = 2, j = 1 
i = 2, j = 1  


按书上说的:结果应该是
i=2,j=1
i=1,j=2
才对啊


------解决方案--------------------
Swap(ref i, ref j);这个已经把i和j的值交换完了,你后面的Swap(i,j);不起作用,当然还是交换完之后的i和j啊,明白了吗,你这样写或许就对了
C# code

    static void Main()  
    {
        int i = 1, j = 2;
        Swap(ref i, ref j);
        Console.WriteLine("i = {0}, j = {1}", i, j);
        i = 1, j = 2;//重置i和j
        Swap(i,j);
        Console.WriteLine("i = {0}, j = {1}", i, j);
    }

------解决方案--------------------
你仔细看,第二个方法,根本没有调换2个数字的位置,所以,它的意图是失败的

第一次换完,已经是2,1了,第二个其实期待的是1,2,但是没有ref,所以意图失败