C#学习:函数的ref 、out 参数
函数参数默认是值传递的,也就是“复制⼀份”,通过函数的处理对数值本⾝并没有影响,如果函数想对数值本⾝产⽣影响就需要使⽤相应的参数。
writeline函数ref 必须先初始化,因为是引⽤,所以必须先“有”,才能引⽤。使⽤ref 如果未进⾏初始化,将报出如图所⽰的错误使⽤了未赋值的局部变量“age”:
加上ref 之后传参传的是引⽤⽽不再是没加ref 时的拷贝。
out 是内部为外部赋值,所以不需要初始化,⽽且初始化也没⽤。执⾏结果:
总结:ref 应⽤场景内部对外部的值进⾏改变,out 则是内部为外部变量赋值,out ⼀般⽤在函数有多个返回值的场所。out 应⽤举例:int.TryParse [csharp]
01. using  System;  02. using  System.Collections.Generic;  03. using  System.Linq;  04. using  System.Text;  05.  06. namespace  refout 参数  07. {  08.    class  Program  09.    {  10.        static  void  Main(string [] args)  11.        {  12.            int  age;  13.            IncAge(ref  age);  14.            Console.WriteLine(age);  15.            Console.ReadKey();  16.        }  17.        18.        static  void  IncAge(ref  int  age)  19.        {  20.            age++;  21.        }  22.        23.    }  24. }  [csharp]
01. using  System;  02. using  System.Collections.Generic;  03. using  System.Linq;  04. using  System.Text;  05.  06. namespace  refout 参数  07. {  08.    class  Program  09.    {  10.        static  void  Main(string [] args)  11.        {  12.            int  age;  13.            IncAge(out  age);  14.            Console.WriteLine(age);  15.            Console.ReadKey();  16.        }  17.        18.        static  void  IncAge(out  int  age)  19.        {  20.            age=20;  21.        }  22.        23.    }  24. }
int.Parse()是⼀种类容转换;表⽰将数字内容的字符串转为int 类型。
如果字符串为空,则抛出ArgumentNullException 异常;
如果字符串内容不是数字,则抛出FormatException 异常;
如果字符串内容所表⽰数字超出int 类型可表⽰的范围,则抛出OverflowException 异常;
int.TryParse 与 int.Parse ⼜较为类似,但它不会产⽣异常,转换成功返回 true ,转换失败返回 false 。最后⼀个参数为输出值,如果转换失败,输出值为 0
执⾏结果:转换成功:转换失败:
ref 应⽤举例:
交换函数Swap :
如果不使⽤ref 参数,Swap 处理的将仅仅是i1和i2的拷贝,对值本⾝没有影响。所以数值没有改变。
使⽤ref 参数则将引⽤传⼊函数,⽽不仅是值得拷贝。执⾏结果:
[csharp]
01. using  System;  02. using  System.Collections.Generic;  03. using  System.Linq;  04. using  System.Text;  05.  06. namespace  refout 参数  07. {  08.    class  Program  09.    {  10.        static  void  Main(string [] args)  11.        {  12.            string  str = Console.ReadLine();  13.            int  i;  14.            if  (int .TryParse(str ,out  i))  //i 在内部被赋值  15.            {  16.                Console.WriteLine("转换成功!{0}",i);  17.            }  18.            else  19.              {  20.                Console.WriteLine("转换失败!{0}",i);  21.            }  22.            Console.ReadKey();  23.        }  24.    }  25. }  [csharp]
01. using  System;  02. using  System.Collections.Generic;  03. using  System.Linq;  04. using  System.Text;  05.  06. namespace  refout 参数  07. {  08.    class  Program  09.    {  10.        static  void  Main(string [] args)  11.        {  12.            int  i1 = 10;  13.            int  i2 = 20;  14.            Swap(ref  i1,ref  i2);  //注意ref 参数  15.            Console.WriteLine("i1={0},i2={1}", i1, i2);  16.            C
onsole.ReadKey();  17.        }  18.        static  void  Swap(ref  int  i1,ref  int  i2)  //注意ref 参数  19.        {  20.            int  temp = i1;  21.            i1 = i2;  22.            i2 = temp;  23.        }  24.    }  25. }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。