标签:
函数参数默认是值传递,也就是“复制一份”
看个栗子:
static void Main(string[] args) { int age = 10; IncAge(age); Console.WriteLine(age);//结果是10,因为函数参数默认是值传递,IncAge()对外面这个age没有影响 Console.ReadKey(); } static void IncAge(int age) { age++; }
ref必须先初始化,因为是引用传递,所以必须先“有”,才能引用。
引用传递:我理解的就是从别人家水渠引来一池水,如果你家水池污染了,那别人家的也会被污染,一处遭殃两处哭丧,一脉相连。引用传递在内存里就是引用了age的内存地址,当你给age(假如地址是0x001)赋值12,那么另一个指向地址0x001的age的值也会改变。
看个栗子:
static void Main(string[] args) { int age = 10;//ref,必须初始化 IncAge(ref age); Console.WriteLine(age);//结果是11,因为ref是引用传递,经IncAge()改变后,Main方法中的age也会受到影响 Console.ReadKey(); } static void IncAge(ref int age) { age++; }
什么时候使用:内部对外部的值进行改变(当然也可以不改变)。
看个栗子:
static void Main(string[] args) { int i1 = 10; int i2 = 20; Swap(ref i1,ref i2); Console.WriteLine("i1={0},i2={1}",i1,i2);//结果是i1=20,i2=10 Console.ReadKey(); } static void Swap(ref int i1, ref int i2) { int temp = i1; i1 = i2; i2 = temp; }
out是内部对外部变量赋值,所以不需要初始化,而且初始化也没用。
举个栗子:
static void Main(string[] args) { int age;//可以初始化,但初始化也没用,out不要 IncAge(out age); Console.WriteLine(age);//结果是12 Console.ReadKey(); } static void IncAge(out int age) { age = 11;//out必须先赋值 age++; }
什么时候使用:内部为外部赋值,out一般用在函数有多个返回值的时候。
举个TryParse()的栗子:
static void Main(string[] args) { string str = 123; int i; if (int.TryParse(str, out i))//out返回两个值,一是ture,转换成功,二是false,转换失败 { Console.WriteLine("转换成功:{0}",i);//结果:123 } else { Console.WriteLine("数据错误:{0}",i);//结果:数据错误:0,转换失败,i就是0 } Console.ReadKey(); }
标签:
原文地址:http://www.cnblogs.com/sean100/p/4564381.html