(原创)c#学习笔记06--函数01--定义和使用函数01--返回值
第六章 函数
本章内容:
● 如何定义和使用不接受或返回任何数据的简单函数
● 如何在函数中传入传出数据
● 使用变量作用域
● 如何结合使用Main()函数和命令行参数
● 如何把函数提供为结构类型的成员
● 如何使用函数重载
● 如何使用委托
我们迄今看到的代码都是以单个代码块的形式出现的,其中包含一些重复执行的循环代码,以及有条件地执行的分支语句。如果要对数据执行某种操作,就应把所需要的代码放在合适的地方。
这种代码结构的作用是有限的。某些任务常常需要在一个程序中执行好几次,例如,查找数组中的最大值。此时可以把相同(或几乎相同)的代码块按照需要放在应用程序中,但这样做也会存在问题。在某个常见任务中,即使进行非常小的改动(例如,修改某个代码错误),也需要修改多个代码块,这些代码块可能分布在整个应用程序中。如果忘了修改其中的一个代码块,就会产生很大的影响,导致整个应用程序失败。另外,应用程序也较长。
解决这个问题的方法是使用函数。(个人觉得上面这段描述,其实是对函数作用的一个很好解释。更是一种思路。)
例如,有一个函数返回数组中的最大值,可以在代码的任何位置使用这个函数,且在每个地方都使用相同的代码行。因为只需要提供一次这段代码,所以对代码的任何修改将影响使用该函数进行的计算。这个函数可以看作包含可重用的代码。
函数还可以提高代码的可读性,因为可以使用函数将相关代码组合在一起。这样,应用程序主体就会非常短,因为代码的内部工作被分散了。
函数还可以用于创建多用途的代码,让它们对不同的数据执行相同的操作。可以采用参数形式为函数提供信息,以返回值的形式得到函数的结果。在上面的示例中,参数就是一个要搜索的数组,而返回值就是数组中的最大值。这意味着每次可以使用同一个函数处理不同的数组。函数的名称和参数(不是返回类型)共同定义了函数的签名。
6.1 定义和使用函数
首先从基础知识开始,看看不与调用代码交换任何数据的简单函数,然后介绍更高级的函数用法。首先看一个示例。代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ch06Ex01 { class Program { static void Write() { Console.WriteLine("Text output from function"); } static void Main(string[] args) { Write(); Console.ReadKey(); } } }
运行结果如下:
上面的代码中,函数定义由以下几部分组成:
两个关键字:static和void
函数名后跟圆括号,如Write()
一个要执行的代码块,放在花括号中
函数Main()是控制台应用程序的入口点函数。当执行C#应用程序时,就会调用它包含的入口点函数,这个函数执行完毕后, 应用程序就终止了。所有C#可执行代码都必须有一个入口点。
void更容易解释。这个关键字表明函数没有返回值。
NOTE: 在定义函数和调用函数时,必须使用圆括号。如果删除它们,将无法编译代码。
6.1.1 返回值
通过函数进行数据交换的最简单方式是利用返回值。有返回值的函数会计算这个值,其方式与在表达式中使用变量计算它们包含的值完全相同。与变量一样,返回值也有数据类型。
例如,有一个函数GetString(),其返回值是一个字符串,可以在代码中使用该函数,如下所示:
string myString; myString = GetString();
还有一个函数GetVal(),它返回一个double值,可以在数学表达式中使用它。
double myVal; double multiplier = 5.3; myVal = GetVal() * multiplier;
当函数返回一个值时,可以采用以下两种方式修改函数:
在函数声明中指定返回值的类型,但不使用关键字void。
使用return关键字结束函数的执行,把返回值传递给调用代码。
从代码角度分析,控制台应用程序函数中的下述代码看起来像是前面见过的函数类型:
static <returnType> <FunctionName>() { ... return <returnValue>; }
这里唯一的限制是<returnValue>必须是一个值,其类型可以是<returnType>,也可以隐式转换为该类型。 但是, <returnType>可以是任何类型,包括前面介绍的较复杂的类型。这段代码可以很简单:
static double GetVal() { return 3.2; }
在执行到 return 语句时,程序会立即返回调用代码。这个语句后面的代码都不会执行。但是,这并不意味着return语句只能放在函数体的最后一行。可以在前边的代码里使用return, 也可能在执行了分支逻辑之后使用。把return语句放在for循环、if块或其他结构中会使该结构立即终止,函数也立即终止。例如:
static double GetVal() { double checkVal; // CheckVal assigned a value through some logic (not shown here). if (checkVal < 5) return 4.7; return 3.2; }
根据checkVal的值,将返回两个值中的一个。这里唯一的限制是return语句必须在函数的闭合花括号 } 之前处理。
最后需要注意的是,return可以用在通过void关键字声明的函数中(没有返回值)。如果这么做,函数就会立即终止。以这种方式使用 return 语何时,在 return 关键字和其后的分号之间提供返回值是错误的。