C#中的方法的参数传递。

C#中方法参数的传递分为两种。一种是值传递,一种是引用传递。

默认是值传递的形式。

通常我们向方法中传递的值,方法获得的是这些值得拷贝,然后使用这些拷贝,当方法执行完毕后,这些拷贝将会被丢弃,而原来的值不将受到影响。

public class User
    {
        //向方法传递一个实参时,对应的形参会用实参的一个副本来初始化,不管形参是值类型(例如int),可空类型(int?),还是引用类型,这一点都是成立的
        //C#中参数的值传递和引用传递区别。参数按值传递时,是拷贝的一个副本,不改变原来的值。参数按引用传递时,是改变引用的地址,所以会改变原变量的值。
        //1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
        //2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。
        int[] arr = {1,2,3,4,5};
        public int[] getArray(int[] ar)
        {
            ar = arr;
            return ar;
             
        }
    }
    class Program
    {

        static void Main(string[] args)
        {
            User u = new User();
        
            int[] i = {2,2};
            u.getArray(i);

            Console.WriteLine(i.Count());
            Console.ReadKey();
        }
    }

output:2      参数按值传递的时候,不会改变变量本身的值,传递的只是一个副本。

 

 

引用传递方式。在方法中如果我们想改变值得本身,我们要用参数的引用传递。前面加ref或者out关键字。

1.ref在传给方法前需要初始化,out不需要

2.out在方法内必须被初始化,否则会报错。

public class User
    {
        //向方法传递一个实参时,对应的形参会用实参的一个副本来初始化,不管形参是值类型(例如int),可空类型(int?),还是引用类型,这一点都是成立的
        //C#中参数的值传递和引用传递区别。参数按值传递时,是拷贝的一个副本,不改变原来的值。参数按引用传递时,是改变引用的地址,所以会改变原变量的值。
        //1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
        //2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。
        int[] arr = {1,2,3,4,5};
        public int[] getArray(ref int[] ar)
        {
            ar = arr;
            return ar;
             
        }
    }
    class Program
    {

        static void Main(string[] args)
        {
            User u = new User();
        
            int[] i = {2,2};
            u.getArray(ref i);

            Console.WriteLine(i.Count());
            Console.ReadKey();
        }
    }

output:5 


引用类型按照值传递的形式传递参数的时候,也是传递一个引用的副本,当改变这个引用里面的值得时候,原类型里的值也会改变的。但是如果你指向一个新的引用的话,就不会改变原类型的值得。

class PassingRefByRef
    {
        static void Change(int[] pArray)
        {
            // Both of the following changes will affect the original variables:
            pArray[0] = 888;
            pArray = new int[5] { -3, -1, -2, -3, -4 };
            System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]);
        }

        static void Main()
        {
            int[] arr = { 1, 4, 5 };
            System.Console.WriteLine("Inside Main, before calling the method, the first element is: {0}", arr[0]);

            Change(arr);
            System.Console.WriteLine("Inside Main, after calling the method, the first element is: {0}", arr[0]);

            Console.ReadKey();
        }
输出结果是:1,-3,888


我们都知道String是引用类型,但是String在赋值的时候容易给人一种是值类型的假象。为什么呢,因为String对象创建后是不能改变的,我们修改String对象的值,其实是再重新创建了一个String对象。例如:

 class Program
    {
        
        static void Main(string[] args)
        {
            string a = "abc";
            string b = a;
            a = "xiaobo";
            Console.WriteLine(a);
            Console.WriteLine(b);
            Console.ReadKey();
        }
    }
输出结果是:xiaobo,abc

分析下:我们把a的引用赋值给了b,那么b就指向了abc这个地址。我们再将a赋值为xiaobo,实际上重新创建了一个String对象。



 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值