我们知道,在c#中,当我们在一个方法中想要访问另一个方法中的变量的时候,有两种解决方案---参数和返回值。但当需要返回多个值,并且是不同类型的值的之后应该怎么办呢?解决方案可以是
(1)将所有类型数据转换成字符串类型,到最后再都转换回来,这样就比较麻烦了
(2)利用方法的out参数和ref参数
下面要跟大家介绍的就是第二个简单的方法:方法的out和ref参数
在讲解方法的out和ref参数之前我们先看看最普通的参数传递
- static void Main(string[] args)
- {
- int number1=10;
- int number2 = 20;
- int sum = AddNumber(number1, number2);
- Console.WriteLine(number1); ;
- Console.WriteLine(number2);
- Console.WriteLine(sum);
- Console.ReadKey();
- }
- public static int AddNumber( int num1, int num2)
- {
- return num1 + num2;
- }
显而易见,此程序的返回值是10,20,30
方法的out参数(与最简单的参数传递差别已用红框标出)
此程序的返回值为10,200,210
概念:out是内部为外部变量赋值,out一般用在函数需要有多个返回值的场所
总结:1.如果方法用参数out修饰了,那么参数在方法外也要用out修饰
2. 如果方法的参数用out修饰了,那么这个参数必须在方法里进行赋值
3.当参数在方法外进行赋值时,参数out把方法里的值传到了方法外,所以最后参数值为在方法里赋的值
例题1:
- static void Main(string[] args)
- {
- int number1=10;
- int number2;
- int sum = AddNumber( number1, out number2);
- Console.WriteLine(number1); ;
- Console.WriteLine(number2);
- Console.WriteLine(sum);
- Console.ReadKey();
- }
- public static int AddNumber(int num1, out int num2)
- {
- num1 = 100;
- num2 = 200;
- return num1 + num2;
- }
开始我理所应当的认为,此程序的返回值为100,200,300,但是大家再仔细看一看,num1没有用out修饰哦,这可是一个大坑哦!
所以,最后的结果是10,200,210
方法的ref参数(与最简单的参数传递差别已用红框标出)
此程序的返回值为10,200,210
很容易可以看出,方法的out和ref只是修改参数,那么他们最后的返回值是相同的
总结:1.如果方法用参数out修饰了,那么参数在方法外也要用out修饰
2.如果方法用参数ref修饰了,那么参数在方法外必须赋初值
那么当这种情况呢?
例题2:
- static void Main(string[] args)
- {
- int number1=10;
- int number2=20;
- int sum = AddNumber( number1, ref number2);
- Console.WriteLine(number1); ;
- Console.WriteLine(number2);
- Console.WriteLine(sum);
- Console.ReadKey();
- }
- public static int AddNumber(int num1, ref int num2)
- {
- num1 = 100;
- num2 = 200;
- return num1 + num2;
- }
例题2用的是ref修饰,返回值为100,200,300;
由此可以看出参数out和ref修饰的差别:
1). ref的使用:使用ref进行参数的传递时,该参数在创建时,必须设置其初始值,且ref侧重于修改;
3). out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。
ref是传递参数的地址,out是返回值
使用ref前必须对变量赋值,out不用。
ref是传入值,out是传出值
参数传递几种方式总汇:
传值(by value),传址(by reference),输出参数(by output),数组参数(by array)。
传值参数无需额外的修饰符——传值参数在方法调用过程中如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此而改变,而是保留原来传入时的值。
传址参数需要修饰符ref——传址参数恰恰相反,如果方法调用过程改变了参数的值,那么传入方法的参数在调用完成以后也随之改变。
实际上从名称上我们可以清楚地看出两者的含义--传值参数传递的是调用参数的一份拷贝,而传址参数传递的是调用参数的内存地址,该参数在方法内外指向的是同一个存储位置。
输出参数需要修饰符out——方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
数组参数需要修饰符params。