4.2 函数是神秘的箱子
知识点讲解:光盘:视频\PPT讲解(知识点)\第4章\函数是神秘的箱子.mp4
C#中的类和函数是为了满足某个功能而设计的一段代码,当程序中需要实现这个功能时,在使用时直接调用此类或函数即可。由此可以看出,类和模块的原理是一样的,一个类是为了描述一个对象而定义的;一个模块是为了实现一个功能而编写的。
C#中的函数又称为方法,它是由对象或类组成的,用于执行特定功能的代码段。函数是编程语言的核心,通过函数定义和函数的调用能够实现现实应用中所需要的功能。方法是函数的最基本成员,其他的函数构成成员都是以方法为基础实现的。所以从本质上讲,函数的实用就是方法的实用。
4.2.1 定义和使用函数
定义C#函数的基本语法格式如下。
特性
修饰符 返回类型 函数名
{
函数语句
}
其中,特性和修饰符是可选的。修饰符用来控制函数的可访问性的范围,返回类型即函数处理结果的返回类型;函数名是定义的函数名称;函数语句是函数的核心。通过定义执行语句,设置这个函数所能够执行的功能。
C#的函数名称是一种标识符,所以它的命名应该符合标识符的命名规则。在具体使用时,最好能够在函数名称中体现出该函数的具体作用。
在项目中调用已定义函数的基本语法格式如下。
函数名(参数)
如果有多个参数,可以使用逗号“,”进行分割。并且各参数和函数定义中的函数类型所对应,或者可以隐式地转换为那种类型。
在特殊需要时,可以使用函数的完全限定名,即包含具体的命名空间和类。例如,前面实例中常用的“System.Console.WriteLine”。
1.函数的返回值
通过函数的返回值可以进行最基本的数据交换,有返回值的函数会计算这个值,其方式与在表达式中使用变量计算它们包含的值相同。例如,有一个函数mm(),其返回值是一个字符串,可以使用如下代码使用这个函数:
string nn;
nn=mm();
由前面的应用实例可知,可以通过如下两种方式修改函数。
- 在函数声明中指定返回值的类型,但不可以使用void关键字。
- 使用return关键字结束函数的运行,并把返回值传送给调用代码。
当在项目程序内使用return语句时,程序会立即返回调用代码,而这个语句后的代码都不会执行。但是,return并不一定是整个函数的最后行。例如下面的代码:
static double getVal()
{
double mm;
i f (mm<6)
return 4.5;
return 3.5;
}
2.函数参数简介
当在函数内使用参数时,必须指定如下内容。
- 定义函数时设置的接受参数以及对应的类型。
- 在函数调用中设置的接受参数。
其中,参数在函数代码中通常作为一个变量。例如在下面的代码中,将参数作为变量进行了处理。
static double mm(double a, doubleb)
{
return a * b;
}
4.2.2 函数参数详解
C#函数既可以有参数,也可以没有参数。在C#程序中,可以根据具体需要使用不同类的参数。C#函数的参数可以分为如下3类。
1.值参数
声明时不使用任何修饰字符的参数是值参数。在C#中,一个值参数相当于一个局部变量,并且在程序声明和调用时,值参数只能将值带进函数,而不能将值带出函数。
2.引用参数
当声明时使用ref修饰符的参数是引用参数。在C#中,一个引用参数不能创建新的存储位置。引用参数表示的存储位置在函数调用中,被作为实际参数给出变量所表示的存储位置。在程序声明和调用时,引用参数既可以将值带进函数内,也可以将值带出函数并在函数外使用。
3.输出参数
声明时使用out修饰符的参数是输出参数。在C#中,一个输出参数不能创建新的存储位置。输出参数表示的存储位置在函数调用中,被作为参数给出变量所表示的存储位置。在程序声明和调用时,输出参数不能将值带进函数内,但能将值带出函数外使用。
在函数内部,输出参数和局部变量一样,最初是被赋值的,即使对应参数已经被明确赋值。所以在使用输出参数时,必须在使用前进行明确的赋值。
实例007 交换处理函数内的参数值
源码路径 光盘\daima\1\4\1 视频路径 光盘\视频\实例\第4章\007
实例文件zhican.cs的具体实现代码如下。
namespace zhican
{
class Program
{
static void mm(int x, int y)
{
Console.WriteLine("进入mm函数时:x = {0}, y = {1}", x, y);
int temp = x;
x = y;
y = temp;
Console.WriteLine("退出mm函数时:x = {0}, y = {1}", x, y);
}
static void Main()
{
int i = 1, j = 2;
Console.WriteLine("执行mm函数前:i = {0}, j = {1}", i, j);
mm(i, j);
Console.WriteLine("执行mm函数后:i = {0}, j = {1}", i, j);
Console.ReadKey();
}
}
}
范例013:获取当前月的天数
源码路径:光盘\演练范例\013视频路径:光盘\演练范例\013范例014:获取当前日期的前一天
源码路径:光盘\演练范例\014视频路径:光盘\演练范例\014\
上述实例代码的设计过程如下。
(1)定义函数mm,并设置2个int类型的参数x和y。
(2)将x和y的值进行赋值处理,并交换它们的值。
(3)定义函数Main,并分别定义int类型的变量i和j。
(4)将变量i和j作为函数mm的参数进行处理。
(5)通过WriteLine输出对应的处理结果。
上述实例代码执行后,将调用函数进行处理,并输出对应的结果,如图4-2所示。
图4-2 实例执行结果
从图4-2的执行结果中可以看出,在函数mm内成功地交换了参数x和y的值。但是不会影响在函数Main内调用函数mm时,所使用的实际参数i和j的值。既然参数可以作为引用参数和输出参数来使用,那么其能否可以作为数组来使用呢?答案是肯定的,C#的参数完全可以作为数组参数和参数数组来使用。
1.参数数组
声明时使用params修饰符的参数是参数数组。在C#中,不能将修饰符params与ref和out组合使用。在函数调用时,可以通过如下两种方式为参数数组指定对应的参数。
- 赋给参数数组的实参是一个表达式,其类型可以隐式转换为参数数组的类型。这样,参数数组将和值参数完全一致。
- 可以为参数数组设置指定个数的实参,也可以是0个。其中的每个实参是一个表达式,其类型可以隐式地转换为参数数组元素的类型。在上述情况下,调用时会创建一个参数数组实型实例,其包含的元素个数等于给定参数的个数。
2.数组参数
在C#项目中,数组可以作为值、引用或输出参数传递给函数,并且可以根据具体要求而灵活使用。当使用数组参数时,必须遵循如下3个原则。
(1)作为值参数
当把数组作为值参数传入时,在传入数组前必须创建数组对象,并且传入前的数组元素值可以传入函数。具体说明如下。
- 如果函数内没有改变数组对象的值,而是仅仅改变了数组元素的值,则在函数内修改的数组元素值可以从函数中带出。
- 如果函数中改变了数组对象的值,则在函数内修改的数组元素值不会从函数中 带出。
(2)作为引用参数
当把数组作为引用参数传入时,在传入数组前必须创建数组对象。传入前的数组元素值可以传入函数,而在函数内修改的数组元素值也可以从函数中带出。
(3)作为输出参数
当把数组作为输出参数传入时,在传入数组前既可以创建数组对象,也可以不创建数组对象。但是如果在传入数组前创建了数组对象,则当传入函数后,该数组对象的值也会被忽略。所以,只有在函数中创建数组对象,数组元素值才会从函数中带出。
读者可以参阅相关资料,或通过百度获取相关的学习资源,了解C#中数组参数和参数数组的使用方法。可结合上述实例,测试数组参数和参数数组的结果。