一: ref 只是一个地址。
在使用这个修饰符的时候必须要进行提前赋值(初始化),因为你不能把一个变量放到一个找不到的地址中。而且必须要显示修饰这个变量。
因为在进入方法(函数中)ref 传递的变量还是它自己,所以任何修改都会反映到ref 变量中。
例子:(我比较懒这个例子是从网上黏贴的)
class gump
{
public double square(ref double x)
{
x = x * x;
return x;
}
}
class TestApp
{
public static void Main()
{
gump doit = new gump();
double a = 3;
double b = 0;
Console.WriteLine("Before square->a={0},b={1}", a, b);
b = doit.square(ref a);
Console.WriteLine("After square->a={0},b={1}", a, b);
}
}
二、 out 是一个传递引用。
因为是引用,所以不必提前赋值,而且即使赋值也没有用当这个引用被声明的时候是空的!即在方法(函数)中使用的时候,out 变量会被清空。也就成了一个没人住的房子的门牌号了。不过不能用out 变量给out 变量赋值。而且因为.net不接受只有地址没有值的参数,out 变量是必须被赋值的。
例子:(同上)
class gump
{
public void math_routines(double x, out double half, out double squared, out double cubed)
//可以是:public void math_routines(//ref double x,out double half,out double squared,out double cubed)
//但是,不可以这样:public void math_routines(out double x,out double half,out double squared,out double cubed),对本例来说,因为输出的值要靠x赋值,所以x不能再为输出值
{
half = x / 2;
squared = x * x;
cubed = x * x * x;
}
}
class TestApp
{
public static void Main()
{
gump doit = new gump();
double x1 = 600;
double half1 = 0;
double squared1 = 0;
double cubed1 = 0;
/*
double x1=600;
double half1;
double squared1;
double cubed1;
*/
Console.WriteLine("Before method->x1={0}", x1);
Console.WriteLine("half1={0}", half1);
Console.WriteLine("squared1={0}", squared1);
Console.WriteLine("cubed1={0}", cubed1);
doit.math_rountines(x1, out half1, out squared1, out cubed1);
Console.WriteLine("After method->x1={0}", x1);
Console.WriteLine("half1={0}", half1);
Console.WriteLine("squared1={0}", squared1);
Console.WriteLine("cubed1={0}", cubed1);
}
ref out 总结:ref侧重修改.out侧重输出,即使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。 out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。
还有就是 ref ,out 不能同时重载一个方法。
三、 params 键字在方法成员的参数列表中使用,为该方法提供了参数个数可变的能力它在只能出现一次并且不能在其后再有参数定义,之前可以。
例子:
class App
{
//第一个参数必须是整型,但后面的参数个数是可变的。
//而且由于定的是object数组,所有的数据类型都可以做为参数传入
public static void UseParams(int id, params object[] list)
{
Console.WriteLine(id);
for (int i = 0; i < list.Length; i++)
{
Console.WriteLine(list[i]);
}
}
static void Main()
{
//可变参数部分传入了三个参数,都是字符串类型
UseParams(1, "a", "b", "c");
//可变参数部分传入了四个参数,分别为字符串、整数、浮点数和双精度浮点数数组
UseParams(2, "d", 100, 33.33, new double[] { 1.1, 2.2 });
Console.ReadLine();
}
} |