------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------
其实,给方法传递参数只有一种方式,就是值传递。只是对于引用类型的传递,传递的是引用地址这个值。这个值是一个地址,与普通数据并没有本质的区别。
一般分类分两种:
1.值传递
2.引用传递
如果变量是通过值传递给方法,那么方法得到的是这个变量的值的副本,对此副本任何的改变并不影响原来变量的本身。
如果变量通过引用传递给方法,那么方法得到的这个引用的副本,由于这两个引用指向的是同一个地址,所以对这个引用所做的改变也会影响到原来变量指向的值。对于复杂的数据类型,按引用传递的效率更高,因为在按值传递时,就必须复制大量的数据。
1.ref参数
值类型变量默认是通过值传递给参数,使用ref参数可以迫使值参数通过引用传送给方法。
例:
Static void DoSomething(ref int i)
{
i=i + 100;
}
在调用该方法时,还需要添加ref关键字
int x=0;//在传递给带有ref修饰的参数之前,必须初始化变量
DoSomething(ref x);
但函数返回后,x的值会被改变为100,如果没有ref修饰的话,按值传递是不会改变原来变量的值的。Ref经常使用来传递结构体给方法,有些比较复杂的结构体如果按值传递给方法效率会比较低,需要复制大量的数据,而在参数前面加上ref,则可强制把结构体按引用的方式进行传递,这样就可以加快结构体的传递速度。但如果这样,就必须注意被调用的方法可以改变结构体的值。可能有人会想,如果这个结构体比较复杂,为什么不创建一个类而是结构体。因为结构体是一个值类型,在为结构分配内存时,速度非常快,因为它们将内联或者保存在栈中。
2.out参数
一般使用out参数来使方法返回多个值。
Static void DoSomething(out int i)
{
i=100;//调用此方法传进来的i的值是无效的,不可以这样写i=i + 100,会报i没有初始化
}
在调用该方法时,还需要添加out关键字
int x;//在传递给带有out修饰的参数之前,不需要初始化变量,如果初始化了也可以,但是没有任何意义,还可能会引起混乱
DoSomething(out x);
如果方法需要返回多个值,一般是在方法的返回值做文章,而不是设置out参数,如自定义一个结构体,作为方法的返回值,就可以返回多个值了,只有在这个基础上还需要返回一些特别的值,而没有必要再建结构体或扩展结构体的前提下才使用这种方式进行返回多个值。
3.params参数
这里的params全称是array parameter,也就是数组参数。 paras类型参数主要用于在对数组长度未知(可变)的情况下进行函数声明。在方法声明中只允许一个params关键字,并且该关键字只能为最后一个。
public static int MaxNumber(params int[] a)
{
int max = a[0];
foreach (int i in a)
{
if (i > max)
{
max = i;
}
}
return max;
}
调用时只需要把数组名传送给方法即可,不需要在前面加params。
4.命名参数
参数一般需要按第一的顺序传送给方法,但命名参数允许按任意顺序传递。
如:string SayHello(string name, string word)
{
returen name + word;
}
一般调用:SayHello(“老孙”, “欢迎来到花果山沐足城”);
也可:SayHello(word: “欢迎来到花果山沐足城”, name: “老孙”);
(这个有意思吗?没意思)
5.可选参数
参数也可是是可选的,但必须为可选参数提供默认值,可选参数还必须是方法定义的最后一个参数。
如:void EventLog(string message,int messageType = 0)
{
//do something
}
调用时,如果要使用默认的信息类型,可这样调用:
EventLog(“数据正确”);//默认的信息类型就是0
如果不使用默认的信息类型,可这样调用:
EventLog(“数据有误”, 1);//达到一个类似于重载的作用