前言
- 本次学习C#的目的是从基础开始打好C#高级开发的基础,查漏补缺,为高级开发所必要的技术做好补全。本文章内容以及本人学习是按照《C#入门经典(第八版)》以及加上自己的理解所创作出来的,十分欢迎和大家在下面评论和补充,谢谢大家,谢谢本书作者和编译者,感谢他们的付出。
定义和使用函数
本次介绍的这个函数,有些地方会叫成"方法"。但是这个术语在.NET编程中有非常特殊的含义,所以现在不用这个术语。
初学者刚刚见到的代码都是用单个代码块形式出现的,其中包含一些重复执行的代码行,以及有条件地执行分支语句。如果要对数据进行操作,就该把代码放在最合适的地方。
这种代码结构是比较有限的,在实际编码需要的情况下,很大部分是需要将一段代码放在程序中的多个位置去执行,如果真的那样做,即使对插入的代码块有非常小的改动(例如有某个代码错误),也需要修改整个代码块,从而产生很大的影响,导致整个应用程序失败,而且应用程序也比较长。
解决这个问题的方法是使用函数。在C#中,函数可提供在应用程序中的任何一处执行的代码块。
函数可以提高代码的可读性,也可以用于创建多用途的代码,让让门对不同的数据执行相同的操作。可以采用参数形式为函数传递信息,已返回值的形式得到函数的结果。
函数的定义包括函数名、返回类型、以及一个参数列表,其中这个参数列表指定了该函数需要的参数数量和参数类型。函数的名称和参数(不是返回类型)共同定义了函数的签名。
-看下面的例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
namespace Ch06Ex01
{
class Program
{
static void Write()
{
WriteLine("Text output from function.");
}
static void Main(string[] args)
{
Write();
ReadKey();
}
}
}
本例中,是下面的代码定义了函数Write():
static void write()
{
writeLine("Text output from function.");
}
看上面的例子可以得出:函数定义由以下几部分组成:
- 两个关键字 :static和void
- 函数名后跟圆括号,如 Wirte()
- 一个要执行的代码块,放在花括号中
一般是采用 PascalCase形式编写函数名。
我们定义Write()函数的代码非常类似应用程序中的其他代码:
static void Main(string[] args)
{
...
}
这是因为,到目前为止我们写的所有代码(定义类型除外)都是函数的一部分。
其中函数Main()是控制台应用程序得入口函数,这个函数执行完毕后,应用程序就终止了。所有C#可执行代码都必须有一个入口点。
但Main()函数和上述write()函数的唯一区别(除了他们包含的代码)是函数名Main后面括号中还有一些代码,这是指定参数的方式。
Main()函数和Write函数都是使用关键字 static 和void定义的。
void更容易解释。这个关键字表明函数没有返回值。
调用的代码如下所示:
Write();
键入函数名,后面跟括号即可。
当程序执行到这行代码的时候,就会运行Writr()函数中的代码。
在定义和调用函数时,必须使用圆括号。如果删除他们,将无法编译代码。
返回值
通过函数进行交换的最简单的方式就是利用返回值。返回值和变量一样,都有数据类型。
当函数返回一个值的时候,必须按照以下两种方式来修改参数:
- 在函数声明中指定一个返回值的类型,但不能使用关键字void。
- 使用return关键字结束函数的执行,把返回值传送给调用代码。
- 当系统执行到return语句的时候,程序会立刻返回调用代码。这条语句后的代码后面的代码都不会执行。但并不意味着return语句只能放在函数体的最后一行。
参数
在当函数接受函数时,必须指定以下内容:
- 函数在定义中指定接受的参数列表,以及这些参数类型。
- 在每个函数调用中提供匹配的实参列表。
C#中的形参是函数定义的一部分,而实参则是由调用代码传递给函数。
但是这两个术语通常被简单的称为参数。
参数匹配
在调用函数的时候,必须使提供的参数与函数定义中指定的参数匹配。这意味着要匹配参数的类型、个数和顺序。
参数数组
C#中允许为函数指定一个(只能指定一个)特殊参数,这个参数必须是函数定义中的最后一个参数。参数数组允许使用不定的参数来调用函数,可使用params关键字来调用它们。
参数数组可以简化代码,因为在调用代码中不必传递数组,而是传递同类型的几个参数这些参数会放在可在函数中使用的一个数组中。
引用参数和值参数
值参数:在使用参数时,把一个值传递给函数所使用的一个变量,在函数中对此变量的任何修改不影响函数调用中指定的参数。
引用参数:函数处理的变量与函数调用中使用的变量相同,不仅仅是值相同的变量。
ref:保证参数不会为新参数分配新地址。
虽然strings是引用类型,但属于特例,因为他们是不可改变的。修改他们会产生新的string,原有的string则会解除分配。如果试图通过ref返回string,则C#编译器Roslyn会报错。
输出参数
- 把为未赋值的变量用作ref参数是非法的,但可以把为赋值的用作out函数。
- 另外再函数使用out函数的时,必须把它看成尚未赋值。
元组
元组的声明形式以下例子说明:
private static (int max ,int min, double average)
GetMaxMin(IEnumerable<int> numbers)
{
return (
Enumerable.Max(numbers),
Enumerable.Min(numbers),
Enumerable.Average(numbers));
}
然后再简单的控制台应用程序下运行下面代码:
static void Main(string[] args)
{
IEnumerable<int> numbers = new int[] {1,2,3,4,5,6 };
var result = GetMaxMin(numbers);
WriteLine($"Max number is {result.max},"+
$"Min number is {result.min},"+
$"Average is {result.average}."
);
元组提供了十分方便和直接的方法来从函数中返回多个值,在程序中不需要结构或更复杂的实现时,使用会元组十分方便快捷有效。