要想充足明白C# out和ref,必须先明白以下两个观点(对值范例与援用范例控制比较好的,能够跳过“一、明白两个基本观点”)
一、明白两个基本观点
值范例:
定义:经由过程值的体式格局来通报,即现实参数向情势参数通报(关于形参和实参术语,这里不定义)。
存储体式格局:重要在栈中。
实质:经由过程值通报,copy副本情势,挪用栈的Pop()和Push()要领来完成。
罕见范例:int,float,bool,enum,struct,Array等。
值范例例子:
//主函数 static void Main(string[] args) { //定义两个实参n1和n2,并初始化 int n1 = 10, n2 = 20; Console.WriteLine("交流前n1和n2的值"); Console.WriteLine("n1={0},n2={1}", n1, n2);//n1=10,n2=20 Swap(n1,n2); Console.WriteLine("交流后n1和n2的值"); Console.WriteLine("n1={0},n2={1}",n1,n2);//n1=10,n2=20 Console.Read(); } /// <summary> /// 交流两个变量的值 /// </summary> /// <param name="n1">形参n1</param> /// <param name="n2">形参n2</param> static private void Swap(int t1,int t2) { int temp; temp =t1; t1 =t2; t2 = temp; }
剖析:以上代码,经由过程值通报,交流两个变量后,并没有转变n1和n2的值,基础原因是,值通报是经由过程copy副本情势,不转变原值。图以下:
1)定义变量n1和n2,并初始化变量,在内存中的示意大抵以下( int n1 = 10, n2 = 20;)
Code调试
在内存中示意
2)实行交流变量要领时
Code调试
在内存中示意
交流细致步骤示意图
援用范例:
定义:经由过程地点来通报,如c++中的指针。浅显地讲,把地点看成开门的钥匙即可。
存储体式格局:重要存储在堆中。
实质:经由过程地点来通报,同享变量,一个转变,一切转变。
罕见范例:String,Object等。
code:c++
// Cpplus.cpp : 定义控制台应用程序的进口点。 // #include "stdafx.h" //主函数 int _tmain(int argc, _TCHAR* argv[]) { void Swap(int *x, int *y); int n1 = 10, n2 = 20; printf("交流前n1和n2的值\n"); printf("%d,%d\n", n1, n2); Swap(&n1,&n2); printf("交流后n1和n2的值\n"); printf("%d,%d",n1,n2); getchar(); return 0; } //交流函数 void Swap(int *x, int *y) { int temp = *x; *x = *y; *y = temp; }
result:
调试
示意图
二、为何引入out和ref
由以上剖析可知,值通报是没法转变变量的值的,若要像c++一样,转变变量的值,该怎么办?c#引入了out和ref来处理该题目。因而,out和ref均属于援用范例。
二、out详解
一句话归纳综合之:out只进不出。
//主函数 static void Main(string[] args) { int n1, n2; Console.WriteLine(GetSum(out n1,out n2)); Console.Read(); } //out参数 static public int GetSum(out int numberFirst,out int numberSecond) { numberFirst = 10; numberSecond = 3; return numberFirst + numberSecond; }
result:
out特性:
1、要领定义和挪用要领都必须显现运用out关键字。(如上代码明显易见)
2、out只出不进,即具有清空要领体外参数功用。(如上代码,读者能够恣意转变n1和n2的值,只需不转变GetSum()要领体,输出的值均为13)
3、为援用范例。(直接挪用而不事前定义n1和n2,编译不经由过程)
4、同名函数,out不与ref同时存在,能够重载。
//以下两个要领能够重载 public void getNumer(int num){} public void setTime(out int num){num=10;} //以下两个要领不能重载 public void getNumer(ref int num){num=10;} public void setTime(out int num){num=10;}
三、ref详解
一句话归纳综合之:有进有出。
//主函数 static void Main(string[] args) { int n1=1, n2=3; Console.WriteLine(refGetSum(ref n1,ref n2)); Console.Read(); } //ref参数 static public int refGetSum(ref int numberFirst, ref int numberSecond) { numberFirst = 10; numberSecond = 3; return numberFirst + numberSecond; }
ref特性:
1、要领定义和挪用要领都必须显现运用ref关键字。(如上代码明显易见)
2、ref有进有出,即能够把值传入要领体内。(如上代码,读者能够恣意转变n1和n2的值)
3、为援用范例。(直接挪用而不事前定义n1和n2,编译不经由过程)
4、同名函数,out不与ref同时存在,能够重载。
四、out与ref异同
重要区分,out只输出yuan'chuang,ref有进有出。
以上就是细致引见C#中out和ref的区分(图文)的细致内容,更多请关注ki4网别的相干文章!