C#params参数、ref参数与out参数

形参与实参

形参:全称为“形式参数”,是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。
实参:全称为"实际参数",是在调用时传递给函数的参数,即传递给被调用函数的值,实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,当代码调用一个方法时,形参的值必须在方法的代码开始执行之前被初始化,用于初始化形参的表达式或变量称作为实参。

初学者也可以简单理解为:

定义方法时在方法后面()中传入的参数为形参,

调用方法时在方法后面()中传入的参数为实参。

params参数

当方法中传入的值的数目不确定时,会使用params参数。params参数用来指定在参数数目可变时采用的方法参数,params参数必须是一维数组。

下面是用params参数实现的多数相加:

        public int Add(params int [] x)
        {
            int sum = 0;
            for (int i = 0; i < x.Length; i++)
            {
                sum += x[i];
            }
            return sum;
        }

        static void Main(string[] args)
        {
            Program a = new Program();
            Console.WriteLine(a.Add(1,2));
            Console.WriteLine(a.Add(1,2,3,4));
        }

需要注意的是,params参数必须是形参列表中的最后一位元素。

public int GetStudent(string name ,float score ,params int [] id)

ref参数

ref参数使方法参数按引用传递,具体作用:当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。(ref关键字必须声明与调用时都显式使用)

假如我们要交换两个数的值

        public void ExchangeNum(int a,int b)
        {
            int temp;
            temp = a;
            a = b;
            b = temp;           
        }
    

        static void Main(string[] args)
        {
            int a = 1, b = 2;
            Program A = new Program();
            A.ExchangeNum(a, b);
            Console.WriteLine("交换后为:{0}和{1}",a,b);
        }

输出结果为:交换后为:1和2

显然这不是我们预想的结果,这个问题我的解释是:代码中int是值类型,所创建的实例不在托管堆中分配内存地址,我们通过方法函数只不过是将数据复制过来,即调用ExchangNum()方法并不影响Main()函数中a和b的值,哪怕把它们复制出来的a和b在ExchangNum()方法中完成了赋值,但是在方法调用完后原来a和b的值还是不变。

至此,我们的需求清晰了:我们需要变量作为参数传给方法,同时希望在方法执行完成后,对参数所做的修改能够反映到变量上

那么我们如何正确的交换两数的值呢?ref参数可以实现:

        public void ExchangeNum(ref int a,ref int b)
        {
            int temp;
            temp = a;
            a = b;
            b = temp;
        }


        static void Main(string[] args)
        {
            int a = 1, b = 2;
            Program A = new Program();
            A.ExchangeNum(ref a,ref b);
            Console.WriteLine("交换后为:{0}和{1}", a, b);
        }

输出结果为:交换后为:2和1

交换成功,因为ref参数修饰变量的传递方式是引用传递,是对参数的地址进行改变,直接能够对原数进行操作,而不是对原数的那个Copy值进行操作。

ref参数的注意事项:

1.ref参数在调用前,必须为其赋值(初始化);

2.其实参只能是变量,不能是常量或者表达式;

3.ref关键字只对紧跟它后面的参数有效,而非应用于整个参数列表;

4.调用方法时,必须使用ref修饰实参,而且因为是引用参数,所以实参和形参的数据类型必须完全匹配;

out参数

out关键字用来定义输出参数,它会导致参数按引用传递,与ref关键字类似,与ref区别在于ref要求变量必须在传递之前初始化,out不用(ref关键字必须声明与调用时都显式使用)

假如我们想在方法中使用未初始化的变量

        public void Add(int a,int b,int c)
        {
            c = a + b;
        }

        static void Main(string[] args)
        {
            int a = 1, b = 2;
            int c;
            Program A = new Program();
            A.Add(a,b,c);
            Console.WriteLine(c);
        }

输出结果如我们所料报错:使用了未赋值的局部变量“c”,但是添加了out关键字后:

        public void Add(int a,int b,out int c)
        {
            c = a + b;
        }

        static void Main(string[] args)
        {
            int a = 1, b = 2;
            int c;
            Program A = new Program();
            A.Add(a,b,out c);
            Console.WriteLine(c);
        }

输出结果为:3

假如我们想在方法中返回多个值

        public void Student(out int id,out string name,out double score)
        {
            id = 1;
            name = "牛马";
            score = 96.5;
        }

        static void Main(string[] args)
        {
            int id = 2;
            string name ="null";
            double score =0;
            Program A = new Program();
            A.Student(out id,out name,out score);
            Console.WriteLine(id);
            Console.WriteLine(name);
            Console.WriteLine(score);
        }

输出结果为:1   牛马   96.5

out参数的注意事项:

1.out参数在调用前可以不赋值(初始化);

2.使用out关键字,可以同时返回多个值;

3.其实参只能是变量,不能是常量或者表达式;

4.out关键字只对紧跟它后面的参数有效,而非应用于整个参数列表;

5.调用方法时,必须使用out修饰实参,而且因为是引用参数,所以实参和形参的数据类型必须完全匹配;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值