1.函数的定义和使用
1.什么是函数?
首先呢,函数是类的一个基本的组成部分,是程序的最小功能单元,之所以要单独提出来讲,是因为它真的是太重要了。我们设计的程序,实际上就是由各种函数所堆叠出来的。
函数也叫方法,这个名字,更加容易理解它的功能。它就是解决一些问题的方法。我时常把它理解成一个 工厂 ,因为这样解释它,非常的简单明了;
一个工厂里面可以有很多的附属,小工厂,就像一个函数中可能时常用到其它的函数一样。当然工厂,肯定是要生成有一定作用的产品的。就像每个函数,都有其专门的功能一样。
工厂生产产品的话,就肯定要有原料,要使工厂,正常的运作,就必须要给它原料,毕竟巧妇难为无米之炊,这点就和函数的传入参数一样,除了没有定义传入参数的函数外,一旦一个函数定义了传入的参数的话(就像工厂,生产一件产品,需要特定的原料)我们要使用这个函数,我们就必须按函数的参数规定传入参数给它加工。
工厂在得到原料之后,就会生产出产品了。我们不用在乎它具体是如何一步步的生产的,我们在乎的只是,最终它给我们的产品。就像函数,我们按规定传入参数,它就会给我们一个返回值,就是加工好的产品。当然也有些工厂是,需要原料,但是却没有产品的,比如垃圾燃烧工厂,它得到原料,是直接的把原料给消耗了,这就是这个工厂的作用。对比与函数,有些函数就是没有返回值,也就是void。
上述讲了一大堆的工厂,函数的。其实都是在讲函数的一些特性,函数是由:函数名,返回值,参数列表所组成;
函数通常定义在类中,是类中的一个功能模块,就比如Person这个类,它里面除了name,age,gender等特性外,不同的人也会有他特有的功能,这个功能,就用函数描述。什么是类,这在面向对象的那里,会详细的讲;
2.函数的定义
语法格式:
<权限修饰符> <静态修饰符><返回类型> <函数名>(参数列表){
//函数体
return <函数返回的值>;
}
权限修饰符和静态修饰符在这里不详细讲,这属于面向对象里面的;
eg:定义一个函数,实现求两个整数的最大值
{
static int GetMax(int para1,int para2){
if(para1 > para2){
return para1;
}else{
return para2;
}
}
}
上面的函数只是一个示例,并不完善,只是为了说明怎么定义函数。这个函数的权限修饰符,我是省略的,c#默认的是private权限,也就是私有的权限。static是静态修饰符,这里不讨论;
返回值是int类型,也就是说,如果我使用到这个函数的话,它会为我返回来一个int类型的数;
函数名是采用帕斯卡命名法,也就是每个单词的首字母都大写。参数列表中的参数个数是不限的,中间用”,”号隔开就可以了。
在函数体中做了一个判断,如果para1>para2成立,就出现了return para1;这句话的意思是,把para1当成最终的值,从函数中返回,给使用函数的人,它的类型必须符合一开始我们定义的返回值类型,也就是int类型,当然这里是符合的。
那么有人就纳闷了,为什么有两个return。其实在一个返回值非void的函数中至少要有一个return,这个函数中多了一个,是因为这个函数的功能,使得函数有两个出口,也就是返回值的地方。如果返回值是void关键字的话,我们就可以不用return语句;但是不用不代表不可以用,在上一节中,我们也讲了,return关键字的作用就是,退出当前的函数,如果程序在函数中执行到它,就直接的从函数中退出。
3.如何使用函数
既然我们都创造了一个工厂了,不用就丧失了原本的意义了,我先口头描述怎么使用函数,然后在演示。在定义函数的时候我们定义了函数名,这个函数名最好是可以体现出函数的功能,这样在日后我们使用它的话,会十分的方便。当然在使用函数的时候是肯定要用到函数名的。
刚开始讲了,使用工厂的话,要给它原料。所以在使用函数时,我们就要为它传入它所规定的参数,当然它如果是规定没有参数的话,就不需要传了。
函数如果是有返回值的话,那么在调用的时候,函数的名字就代表了函数的返回值,此时我们可以定义一个和函数返回值的类型相同的变量,来接收函数处理过后的值(也就是返回后的值),当然也可以不接收。
讲了一大堆空话,来点实际的,其实有时候我感觉,想解释一个抽象的概念真的不容易,这种只可意会,不可言传的感觉,真悲惨。所以我就尽量的想用多的文字叙述,来锻炼自己的,表达抽象概念的能力,大家可能看到这么一大堆的文字会头晕,但是我的描述,通常不会像教科书,那样的死板,我会把我当初是怎么理解那些概念的方法,告诉大家。我不是专业的老师,我也只是一个为了兴趣而学习的一个学习者,可能我的blog中有些bug,如果大家发现了,请即时的告知我,谢谢啦!我的总结中纯代码的演示,很少,通常我都是在解释一些概念性的东西,因为我感觉如果你脑子里面没有概念,而是只是把源代码放那,你看一遍,我觉得这样学习的效果,不好。我告诉你一个概念,你懂了,那么就去尝试,实在不行在从网上找源代码看,我觉得这样学习效果会好一些,当然这也是因人而异的。
切入正题:
static void Main(string[] args){
//假设之前我们已经定义好了,GetMax函数
int max = GetMax(3,5);//定义一个变量接收函数返回来值
Console.WriteLine(max);//输出结果
}
上面的代码中,看似只有两行,但是其实程序却干了很多事,只是太太快了,让你没有察觉到;
首先这是在Main函数中,也就是主函数中,这个在下一节中会讲。程序看到有一个函数GetMax被调用了,那么它便带着GetMax需要的两个参数3和5,跑到GexMax中去执行,然后通过判断得出了最大值是5,然后程序带着5就回来了,此时在Main函数中,GetMax(3,5)代表的就是5了,然后我定义了一个整型的变量接收了它,最后打印在了控制台上;