1. 引用类型与值类型的对比:引用类型的值是对数据实际存储位置的引用。更改不了变量值(即引用地址本身)但可以更改引用所指向的数据。而值类型则更改的是变量副本,不会影响原始数据。数据类型中与地址相关的例如string、数组等为引用类型,直接与值相关的例如int等为值类型。
2. 引用参数ref:使参数以传引用的方式传递,是被调用的方法可以用新值来更新调用者的变量。ref参数只是传递的变量的别名,即只是为现有的变量分配了参数名,而不是创建新变量并将实参的值复制给它。就以下简单例子说明。
namespace ConsoleApp1 { class Program { static void Main() { string one = "null"; string two = "Your name?"; System.Console.WriteLine("The old : {0} and {1}!!!",one ,two ); Swap(ref one , ref two); System.Console.WriteLine("The new : {0} and {1}!!!", one, two); test(one, two); System.Console.WriteLine("The three : {0} and {1}!!!", one, two); System.Console.ReadLine(); } static void Swap(ref string x, ref string y) { string temp; x = "Swap"; temp = x; x = y; y = temp; } static void test(string x, string y) { string temp; x = "test"; temp = x; x = y; y = temp; } } }
输出结果:
3. 输出参数out:以传引用的方式写入一个未初始化的局部变量(ref参数的变量需在被方法调用前赋值,而out参数的变量则不需要)以下两张图可以明显看出正误
4. 引用参数ref与输出参数out的区别
ref旨在改变变量的值,需要初值。而out旨在输出变量的值,不需要初值,需终值。
out:即使在调用之前,赋了初值,但在方法体中调用时值被清除,但因其旨在输出,故而需为其在方法体中赋终值。使方法体有多个返回值时可用(开发人员可以通过声明一个或多个out参数来克服方法只有一个返回类型的限定,例如如果方法要返回两个值,就可以使用以方法返回值形式正常返回一个值,另一个值写入别名变量并作为out参数传递。)。