一、概述
C#中的程序模块称为方法和类,C#程序由方法和类组合而成。方法由一个方法调用语句来调用,这个方法调用描述了方法名,并且可提供调用该方法执行具体任务所需要的信息(参数),当方法调用完成后,该方法要么返回一个值给调用它的方法,要么只是简单地向调用它的方法返回控制。
方法使得程序员可以模块化程序,用方法模块化程序有几种优点:
一是这种分而治之的方式使得程序的开发易于管理;
二是可以实现软件重用,使用已有的方法和类作为构件来创建新的程序,这样我们就可以使用正确的方法名和定义来创建由标准方法创建的程序,而不用构建自定义的代码;
三是避免了程序中重复编写代码,以方法的形式封装起来的代码可以在程序中的几个位置。
二、方法的声明
方法是类中用于执行计算或其它行为的成员,下面是方法的声明格式:
属性方法修饰符返回值类型方法名(参数列表)
{
声明和语句
}
上面的第一行也被称为方法头,花括号圈起来的部分称为方法体。
方法头中的方法修饰符可以是下面关键字中的一个:new、public、protected、internal、private、static、virtual、sealed、override、abstract和extern。对于使用了abstract和extern修饰符的方法,方法的执行体中只能是空语句块,其它所有的方法执行体中,应包含调用该方法所要执行的语句。
返回值类型是方法返回给其调用者结果的数据类型,方法至多可以返回一个值,当有返回值时,必须使用return语句返回与返回值类型一样的数据,当不想返回任何值时,可以使用void返回值类型。
方法名可以是任何标识符,但是一般选择能够表示该方法操作的标识符。方法名不应与同一个类中的其它方法同名,也不能与类中的其它成员名称相同。
参数列表是一个由逗号分隔开的列表,方法在其中定义了每个参数的类型和名称。方法调用时必须为该方法定义的每个参数指明一个参数值,并且这些参数值出现顺序也必须和该方法所定义的参数顺序相同。而且调用方法给的这些参数值的类型也必须和被调用方法的对应参数类型相一致。
方法体是指一个程序块,如前所述,程序块是以花括号括起来的一组声明和语句,变量可以声明在任何程序块中,并且程序块可以嵌套。
下例显示了方法声明和使用情况:
usingSystem;
classTest
{
publicintmax(intx,inty)
{
if(xy)
returnx;
else
returny;
}
publicvoidMain()
{
Console.WriteLine(“themaxof6and8is:{0}”,max(6,8));
}
}
程序的输出是
themaxof6and8is:8
三、方法中的参数
C#中方法的参数有四种类型,它们分别是:
1值参数
值参数不含任何修饰符
2引用参数
以ref修饰符声明引用型参数
3输出参数
以out修饰符声明输出参数
4数组参数
以params修饰符声明数组型参数
3.1值参数
当利用值向方法传递参数时,编译程序给实参的值做一份拷贝,并且将此拷贝传递给该方法。被调用的方法不会修改内存中实参的值,所以使用值参数时,可以保证实际值是安全的。
下面这个方法试图完成将两个数值进行交换:
staticvoidSwap(intx,inty)
{
inttemp=x;
x=y;
y=temp;
}
下面我们调用该函数完成两个数的交换:
staticvoidMain()
{
inti=1,j=2;
Swap(i,j);
Console.WriteLine("i={0},j={1}",i,j);
}
上面调用的输出结果是:
i=1,j=2
分析:
出现这种结果的原因是,Swap方法的参数是使用的值传递方式,上面我们强调了值参数在传递时,编译器会生成一份拷贝,所以Swap交换的实际上是拷贝的值,而不是实参的值
3.2引用参数
从上面例子中,我们知道值参数无法完成数值交换,如果要完成数据交换,必须在方法调用传入实参本身,而非实参的拷贝。C#为我们提供了另外一种参数传递方式,这就是引用参数,和值参不同的是引用型参数并不开辟新的内存区域,当利用引用型参数向方法传递形参时,编译程序将把实际值在内存中的地址传递给方法。
下面我们还是以交换两个数值的例子来讲解引用参数的使用。
staticvoidSwap(refintx,refinty)
{
inttemp=x;
x=y;
y=temp;
}
因此我们在调用Swap时需要如下调用:
staticvoidMain()
{
inti=1,j=2;
Swap(refi,refj);
Console.WriteLine("i={0},j={1}",i,j);
}
这次函数输出结果为:
i=2,j=1
#我是科技创作人#