函数
c#是通过静态函数来实现模块化程序设计的。
1.1函数的定义:
任何函数都是由函数说明和函数体两部分组成。
根据函数是否需要参数,可将函数分为:无参函数和有参函数。
1、无参函数的一般形式:
函数类型 函数名(函数参数)
{
说明语句部分;
可执行语句部分;
}
2、有参函数的一般形式 :
函数类型 函数名(数据类型 参数[,数据类型 参数2……])
{
说明语句部分;
可执行语句部分;
}
有参函数比无参函数多了一个参数表。调用有参函数时,调用函数将赋予这些参数实际的值。
为了与调用函数提供的实际参数区别开,将函数定义中的参数表称为形式参数表,简称形参表。
【案例】定义一个函数,用于求两个数中的大数。
/*功能:定义一个求较大数的函数并在主函数中调用*/
static int Max(int n1,int n2)
{
return(n1>n2?n1:n2);
}
static void Main(string[] args)
{
int num1,num2;//声明两个变量
num=4;//赋值
num2=7;//赋值
//调用Max函数
int s=Max(num1,num2);
Console.WriteLine(s);
Console.ReadKey();
}
1.2、函数的返回值与函数类型:
函数可分为有返回函数和无返回函数两种。
1、函数返回值与return语句:
有参数的返回值,是通过函数中的return语句来获得的。
注意:调用函数中无return语句,并不是不返回一个值,而是一个不确定的值。为了明确表示不返回值,可以用“void”定义成“无(空)类型”。
2、函数类型:
在定义函数时,对函数类型的说明,应与return语句中、返回值表达式的类型一致。
如果不一致,则以函数类型为准。如果缺省函数类型,则系统一律按整数处理。
良好的程序设计习惯:为了使程序有良好的可读性并减少错误,凡不要求返回值的函数都应定义为空类型;即使函数类型为整数,也不使用系统的缺省处理 。
1.3、函数的调用:
在程序中,是通过对函数的调用来执行函数体的,其过程与其它语言的子程序调用相似。
函数调用的一般形式为:函数名([实际参数表]);
切记:实参的个数、类型和顺序,应该与被调用函数所要求的参数个数、类型和顺序一致,才能正确的进行数据传递。
几种函数调用方式:
1、函数表达式:函数作为表达式的一项,出现在表达式中,以函数返回值参与表达式的运算。(这种方式要求函数是有返回值的)
2、函数语句:函数可以只进行某些操作而不返回函数值。(这时的函数调用可作为一条独立的语句。)
3、函数参数:函数作为另一个函数调用的实际参数出现。(这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的)
1.4、函数的形参与实参:
函数的参数分为形参和实参两种,作用是实现数据传送。
形参出现在函数定义中,只能在该函数体内使用。发生函数调用时,调用函数把实参的值复制1份,传送给被调用函数的形参,从而实现调用函数向被调用函数的数据传送。
【案例】实参对形参的数据传递
/*实参对形参的数据传递*/
static void s(int n)
{
int i;
Console.WriteLine(n);
for(i=n-1;i>=1;i--)
n=n+1;//改变形参的值
Console.WriteLine(n);//输出改变后的形参的值
}
static void Main(string [] args)
{
int n=10;//定义实参n,并初始化
s(n);//调用函数
Console.WriteLine(n);//查看实参是否因函数调用而改变
Console.ReadKey();
}
说明:1、实参可以是常量、变量、表达式、函数等;无论实参是何种类型的量,在进行函数调用时,他们都必须具有确定的值,以便把这些值传递给形参。(因此,应预先用赋值、输入等办法,使实参获得确定的值)
2、形参变量只有在被调用时,才分配内存单元;调用结束时,即刻释放所分配的内存单元。
3、实参对形参的数据是单向的,即只有把实参的值传递给形参,而不能把形参的值反向的传递给实参。
4、实参和形参占用不同的内存单元,即使同名也互不影响。
2、数组作为函数参数:
数组用作函数参数有两种形式:一种是把数组元素作为实参使用;另一种是把数组名作为函数的形参和实参使用。
2.1、数组元素作为函数参数:
数组元素就是下标变量,它与普通变量并无区别。
数组元素只能用作函数实参,其用法与普通变量完全相同:在发生函数调用时,把数组元素的值传送给形参,实现单向值传递。
【案例】写一函数,统计字符串中字母的个数
static bool isalp(char c)
{
if(c>='a'&&c<='z'||c>='A'&&c<='Z')
{
return true;
}
else
{
return false;
}
}
static void Main(string [] arge)
{
int i,num=0;//声明变量
string line=Console.ReadLine();//接收用户输入
char[] str=line.ToCharArray();//将字符串转换为字符数组
int lineLen=str.Length;//得到字符数组的长度
for(i=0;i<lineLen;i++)
{
if(isalp(str[i]))
{
num++;
}
}
Console.WriteLine(num);
Console.ReadKey();
}
说明:1、用数组元素作实参时,只要数组类型和函数的形参类型一致即可,并不要求函数的形参也是下标变量。换句话说,对数组元素的处理是按普通变量对待的。
2、在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元。在函数调用时发生的值的传递,是把实参变量的值赋予形参变量。
2.2、数组名作为函数的形参和实参:
与数组元素作为函数的形参和实参不同,用数组元素作实参时,对数组的处理是传递引用(地址)。
即在数组作函数参数时,形参变量和实参变量是由编译系统分配的两个相同的内存单元。在函数调用时发生的地址传送,是把实参的地址赋予形参变量。
------------类的成员方法实际上是函数,可分为一般的成员方法和构造函数与析构函数。------------