c#编程基础之ref、out参数
引例:
先看这个源码,函数传递后由于传递的是副本所以真正的值并没有改变。
源码如下:
using System; using System.Collections.Generic; using System.Text; namespace refout参数学习 { class Program { static void Main(string[] args) { int age = 20; IncAge(age); Console.WriteLine(age);//打印结果还是20 Console.ReadKey(); } static void IncAge(int age)//复制了一份,所以IncAge内部改变的是副本 { age++; } } }
运行截图:
要解决上面方法就需要使用ref参数:
上面源码修改后如下:
using System; using System.Collections.Generic; using System.Text; namespace refout参数学习 { class Program { static void Main(string[] args) { int age = 20; IncAge(ref age);//此处必须也加上参数ref Console.WriteLine(age);//使用参数ref后,传递真值,而不是副本,所以打印21 Console.ReadKey(); } static void IncAge(ref int age)//使用ref参数后,传递过来的将不是副本,而是原本,函数内改变,其值也将发生改变 { age++; } } }
程序截图:
out参数由内部进行赋值,所传递参数无需初始化,而且即使初始化也没用。
源码如下:
using System; using System.Collections.Generic; using System.Text; namespace refout参数学习 { class Program { static void Main(string[] args) { int age; IncAge(out age);//此处必须也加上参数out Console.WriteLine(age);//使用参数out后,传递真值,并有函数内部赋值所以打印22 Console.ReadKey(); } static void IncAge(out int age)//使用out参数后,所传递值不需要初始化,由函数内部为其赋值。 { age = 22; } } }
程序截图:
out参数应用场景:
源码如下:
using System; using System.Collections.Generic; using System.Text; namespace refout参数学习 { class Program { static void Main(string[] args) { string str = Console.ReadLine(); int i; if(int.TryParse(str,out i)) { Console.WriteLine("转换成功!{0}",i); } else { Console.WriteLine("数据错误!"); } Console.ReadKey(); } } }
运行结果:
ref运行场景,比如我们先看这个源码:
using System; using System.Collections.Generic; using System.Text; namespace refout参数学习 { class Program { static void Main(string[] args) { int i1 = 10; int i2 = 20; Swap(i1, i2);//将i1和i2各复制一份传递给函数 Console.WriteLine("i1={0},i2={1}", i1, i2);//i1和i2没有发生交换,还是i1=10,i2=20 Console.ReadKey(); } static void Swap(int i1, int i2) //交换函数 { int temp=i1; i1 = i2; i2 = temp; } } }
运行结果:
想要实现真的交换,这时就需要ref参数了,修改源码如下:
using System; using System.Collections.Generic; using System.Text; namespace refout参数学习 { class Program { static void Main(string[] args) { int i1 = 10; int i2 = 20; Swap(ref i1,ref i2);//将i1和i2传递给函数 Console.WriteLine("i1={0},i2={1}", i1, i2);//i1和i2发生交换,还是i1=20,i2=10 Console.ReadKey(); } static void Swap(ref int i1,ref int i2) //接受传递来的i1和i2的值,将i1和i2的值进行交换。 { int temp=i1; i1 = i2; i2 = temp; } } }
程序截图:
*********************
交流即分享,分享才能进步!
不对之处,还请各位前辈多多指教。
by 星云
********************