方法的参数传递有两种方式 :传值方式和传引用方式


一.传值方式


1.定义:在方法的参数中没有ref 或out修饰的参数都是以传值方式传递的

2.特点:传值分为两种情况:
 
   a.当参数为值类型时,那么向方法传递的是具体的值,参数在以传值方式传递时,那么形参接收到的将是实参具体值的一个副本,那么对形参做的任何修改都不会影响到实参,因为实参和形参在内存中的存储位置不同。

   b.当参数时引用类型时,那么向方法传递的是变量的引用,所以参数在以传值方式传递时,形参接收到的是实参(引用变量)的引用地址的副本,而实际数据的存储位置没有发生变化,这样对形参的数据的修改也就间接的修改了实参的数据,但是对形参对象的改变不会影响到实参对象

二.传引用方式

1.定义:在方法的参数中含有ref或out修饰的参数是以传引用方式传递的

2.特点:传引用分为两种情况:

   a.当参数为值类型时,那么向方法传递的是具体的值,参数以传引用方式传递时,形参接收到的不是实参的副本而是实参本身的数据,(相当于给实参创建了一个快捷方式,名字是形参,但是它代表的确实实参),所以对形参的任何修改,都将反应到实参上。

   b.当参数时引用类型时,那么向方法传递的是变量的引用,参数以传引用方式传递时,形参接收到的不是实参引用的副本而是实参本身,所以在方法内对形参的重新分配内存(重新new),也会影响到实参,因此给形参做的任何修改都会反应到实参上,包括重新new 以及修改数据。

三.实例


1.传值实例:

class Program
     {
         static void Main(string[] args)
         {
             int myInt = 5;
             int[] myArr ={1,4,5};


             //当参数时值类型
             Console.WriteLine("当参数时值类型时的结果如下:");

             //在调用在SquareIt(int x)方法前
             Console.WriteLine("在调用在SquareIt(int x)方法前 myInt={0}",myInt);

             //在调用在SquareIt(int x)方法中
             Console.WriteLine(SquareIt(myInt));

             //在调用在SquareIt(int x)方法后
             Console.WriteLine("在调用在SquareIt(int x)方法后 myInt={0}", myInt);

             //当参数时引用类型
             Console.WriteLine("当参数时引用类型时的结果如下:");

             //在调用在Change(int[] arr) 方法前
             Console.WriteLine("在调用在Change(int[] arr) 方法前 myArr[0]={0}", myArr[0]);

             //在调用在Change(int[] arr) 方法中
             Console.WriteLine(Change(myArr));

             //在调用在Change(int[] arr) 方法后
             Console.WriteLine("在调用在Change(int[] arr) 方法后 myArr[0]={0}", myArr[0]);


             Console.ReadKey();


         }


         static string  SquareIt(int x) 
         {
             x *= x;
             return string.Format("在SquareIt(int x)内  x={0}",x);
         }


         static string Change(int[] arr) 
         {
             arr[0] = 888;
             arr = new int[5] { -1,-2,-3,-4,-5};
             return string.Format("在Change(int[] arr) 内  arr[0]={0}", arr[0]);
         }
     }

  最后结果是:
        /// 在调用在SquareIt(int x)方法前 myInt=5
        /// 在SquareIt(int x)方法中 x=25
        /// 在调用在SquareIt(int x)方法后 myInt=5
        /// 
        /// 在调用在Change(int[] arr) 方法前 myArr[0]=1
        /// 在Change(int[] arr) 方法中 myArr[0]=-1
        /// 在调用在Change(int[] arr) 方法前 myArr[0]=888


1.传值实例:

 

class Program
     {
         static void Main(string[] args)
         {
             int myInt = 5;
             int[] myArr = { 1, 4, 5 };


             //当参数时值类型
             Console.WriteLine("当参数时值类型时的结果如下:");

             //在调用在SquareIt(int x)方法前
             Console.WriteLine("在调用在SquareIt(int x)方法前 myInt={0}", myInt);

             //在调用在SquareIt(int x)方法中
             Console.WriteLine(SquareIt(ref myInt));

             //在调用在SquareIt(int x)方法后
             Console.WriteLine("在调用在SquareIt(int x)方法后 myInt={0}", myInt);

             //当参数时引用类型
             Console.WriteLine("当参数时引用类型时的结果如下:");


             //在调用在Change(int[] arr) 方法前
             Console.WriteLine("在调用在Change(int[] arr) 方法前 myArr[0]={0}", myArr[0]);

             //在调用在Change(int[] arr) 方法中
             Console.WriteLine(Change(ref myArr));


             //在调用在Change(int[] arr) 方法后
             Console.WriteLine("在调用在Change(int[] arr) 方法后 myArr[0]={0}", myArr[0]);

             Console.ReadKey();
         }
         static string SquareIt(ref int x)
         {
             x *= x;
             return string.Format("在SquareIt(int x)内  x={0}", x);
         }


         static string Change(ref int[] arr)
         {
             arr[0] = 888;
             arr = new int[5] { -1, -2, -3, -4, -5 };
             return string.Format("在Change(int[] arr) 内  arr[0]={0}", arr[0]);
         }
     }


     最后结果是:
        /// 在调用在SquareIt(int x)方法前 myInt=5
        /// 在SquareIt(int x)方法中 x=25
        /// 在调用在SquareIt(int x)方法后 myInt=25
        /// 
        /// 在调用在Change(int[] arr) 方法前 myArr[0]=1
        /// 在Change(int[] arr) 方法中 myArr[0]=-1
        /// 在调用在Change(int[] arr) 方法前 myArr[0]=-1