C#学习笔记-方法和修饰符

1.默认的参数传递行为

参数传入函数的默认行为是按值传递,相当于数据的副本会被传入函数,调用者看不到在函数内容针对这些变量发生了哪些变化,这些变化也不会影响到调用者传递的参数。

        static int Add(int x, int y)
        {
            int ans = x + y;
            x = 100;
            y = 9;
            return ans;
        }

在函数Add中,虽然修改了x,y的值,不过这只是表面现象,只是修改的x,y的副本,并不影响传值之前的x,y的本身。如果我们在主函数里这样调用:

        static void Main(string[] args)
        {
            int x = 9, y = 10;
            Console.WriteLine("Before call: " + x + "," + y);
            Console.WriteLine("Answer is: " + Add(x, y));
            Console.WriteLine("After call: " + x + "," + y);
        }
得到的结果是:

Before call: 9,10
Answer is: 19
After call: 9,10
对函数体做下面的改变:

        static int Add(int x, int y)
        {
            int ans = x + y;
            x = 100;
            y = 9;
            return x + y;//返回值109
        }
这样的结果就是无论传递值是什么,都会返回109.

Before call: 9,10
Answer is: 109
After call: 9,10

2.out修饰符

接着,将使用输出参数,通过关键字out来定义输出参数,在退出函数之前,需要为输出参数赋值,否则就会有编译错误。引入输出参数的用处是可以通过一个方法输出多个输出值。比如定义下面的函数。

        static void GetAnswer(int x, int y, out int ansA, out int ansS, out int ansM)
        {
            ansA = x + y;
            ansS = x - y;
            ansM = x * y;
        }
注意这里函数本身的返回值为void,定义了三个输出参数,分别用来输出两个默认参数的和,差,积。在调用这个函数时,输出参数传递也必须使用out修饰符。

        static void Main(string[] args)
        {
            int x = 9, y = 10;
            int ans1, ans2 = 5, ans3;
            Console.WriteLine("Before call: " + x + "," + y);
            GetAnswer(x, y, out ans1, out ans2, out ans3);
            Console.WriteLine("The answers are: " + ans1 + "," + ans2 + "," + ans3);
        }
注意,作为输出参数传递的变量不需要赋值,如ans1,ans3,即使象ans2已经被赋值,这个值也会丢失。输出为:

Before call: 9,10
The answers are: 19,-1,90

3.ref修饰符

另外一种修饰符是ref,如果希望方法可以对在调用者作用域中声明的不同数据进行操作(通常就是改变它的值),比如排序和交换,就必须使用引用参数。注意输出参数和引用参数的区别:

输出参数不需要在它们被传递给方法之前初始化,因为方法在退出之前必须为输出参数赋值;

引用参数必须在它们被传递给方法之前初始化,因为是在传递一个对已存在变量的引用。如果不赋值,就相当于要对一个未赋值的本地变量进行操作。

考虑下面的方法:

        static void SwapThings(ref string s1, ref string s2)
        {
            string tempS = s1;
            s1 = s2;
            s2 = tempS;
        }
以下面的方式调用:

        static void Main(string[] args)
        {
            string myname = "Tom", yourname = "Jerry";
            Console.WriteLine("My name is " + myname + "." + " Your name is " + yourname + ".");
            SwapThings(ref myname, ref yourname);
            Console.WriteLine("My name is " + myname + "." + " Your name is " + yourname + ".");
        }

输出为:

My name is Tom. Your name is Jerry.
My name is Jerry. Your name is Tom.

4.params修饰符

C#使用params关键字支持参数数组的使用,它可以把可变数量的参数(相同类型)作为单个逻辑参数传给方法。

        static double CalAverage(params double[] values)
        {
            Console.WriteLine("You sent me {0} doubles.", values.Length);
            double sum = 0.0;
            if (values.Length == 0)
                return sum;
            for (int i = 0; i < values.Length; i++)
                sum += values[i];
            return (sum / values.Length);
        }

正常的想法是我们直接传递一个double数组给这个函数,这是没问题的,其实我们还可以直接给它几个double的数值,用逗号隔开,这样相当于.NET运行库在后台自动把这组double包装成一个double类型的数组。所以有以下的调用方式:

        static void Main(string[] args)
        {
            double average;
            average = CalAverage(4.0, 3.2, 5.7, 64.22, 87.2);
            Console.WriteLine("Average of data is: {0}", average);
            double[] dats = { 4.0, 3.2, 5.7 };
            average = CalAverage(dats);
            Console.WriteLine("Average of data is: {0}", average);
            Console.WriteLine("Average of data is: {0}", CalAverage());
        }
第一种方式就是直接给出一组double数值,第二种方式是以数组的形式传递,第三种方式为空时。

需要注意:为了避免歧义,C#要求方法只支持一个params参数,而且必须是参数列表中的最后一个参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极地语音工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值