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

来源:互联网 发布:nginx 多个域名 ssl 编辑:程序博客网 时间:2024/05/18 00:06

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,10Answer is: 19After 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,10Answer is: 109After 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,10The 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参数,而且必须是参数列表中的最后一个参数。

0 0
原创粉丝点击