方法传递参数的方式

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


一.传值方式


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值