函数二

关于函数(二)

三.变长参数和参数默认值

变长参数关键词

举例: 函数要计算n个整数的和。

按照常规思路 static int Sum(int a,int b,……………)

这里,我们引入变长参数关键字params

1
2
3
4
5
6
7
8
9
10
static int Sum(params int[] arr){
int sum=0;
for(int i=0;i<arr.Length;i++){
sum+=arr[i];
}
return sum;
}
//调用过程如下
Sum(1,2,3,4,5............);
//想存几个存几个。

params int[] 意味着可以传入n个int参数,n可以等于0;传入的参数会存在arr数组中。

注意:1.params关键字后面必须为数组

​ 2.数组的类型可以是任意的类型。

​ 3.函数参数可以有别的参数和params关键字修饰的参数。

​ 4.函数参数中只能最多出现一个params关键字,并且一定是在最后一组参数,前面可以有n个其他参数。

对于4的解释

1
2
3
4
static void Eat(string name,params string[],things,int a);
//这样会直接报错。因为我们在使用变长参数的时候,是可以输入n个参数的,这个时候如果后面还有其他参数,程序就会分不清楚即将输进去的值是给params还是给后面的参数。
//应改变为
static void Eat(string name,int a,params string[],things);

参数默认值

有参数默认值的参数,一般称为可选参数。

作用是当调用函数时可以不传入参数,不传入就会使用默认值作为参数的值。

注意:1.支持多参数默认值,每个参数都可以有默认值。

​ 2.如果要混用,可选参数必须写在普通参数的后面。

1
2
3
4
5
6
7
8
static void Speak(string str="我没什么话可以说"){
Console.WriteLine(str);
}
//下面是调用过程
Speak();
//可以不用传入参数,结果会输出默认值。
Speak(123123);
//如果传入参数,则使用传入的参数。

四.函数重载

基本概念

重载概念:在同一语句块(class或者struct)中,函数名相同但是函数参数的数量不同,或者函数参数的数量相同但是参数的类型或者顺序不同。

作用:命名一组功能相似的函数,减少函数名的数量,避免命名空间的污染,并提升程序的可读性。

实例

注意:重载和返回值无关,只会和参数类型,个数,顺序有关

调用时,程序会自己根据传入的参数类型判断使用哪一个重载。

参数数量不同

1
2
3
4
5
6
7
8
9
static int CalcSum(int a,int b){
return a+b;
}
//先定义一个原本的函数。
static int CalcSum(int a,int b,int c){
return a+b+c;
}
//这就是对函数的重载了,这是不会报错的。
//在C#中,使用时系统会要求你选择一个重载进行调用(如果有重载的话)

数量相同,类型不同

1
2
3
4
5
6
7
8
9
//原函数还是上面的第一个函数
static float CalSum(float a,float b){
return a+b;
}
//调用时
CalSum(1,1f,1,2f);
//调用float类型的
CalSum(1,2);
//调用int类型。

顺序不同同理,不做赘述

加了ref或者out的函数,也可以看作一个不一样的重载函数

可变参数同理

可选参数不能算重载

PS:我们常用的WriteLine其实也是重载函数,重载如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void Write(char[] buffer, int index, int count);
public static void Write(double value);
public static void WriteLine(uint value);
public static void WriteLine(string format, params object?[]? arg);
public static void WriteLine();
public static void WriteLine(bool value);
public static void WriteLine(char[]? buffer);
public static void WriteLine(char[] buffer, int index, int count);
public static void WriteLine(decimal value);
public static void WriteLine(ulong value);
public static void WriteLine(int value);
public static void WriteLine(float value);
public static void WriteLine(string? value);
public static void WriteLine(string format, object? arg0, object? arg1);
// The second object to write using
public static void WriteLine(string format, object? arg0, object? arg1, object? arg2);
public static void WriteLine(long value);
public static void WriteLine(char value);

(以上是WriteLine的部分重载函数)

五.递归函数

基本概念

递归函数就是让函数自己调用自己。

eg:

1
2
3
4
static void Fun(){
Fun();
}
//这就是一个递归函数,但是它会陷入死循环。

一个正确的递归函数:1.必须有结束调用的条件。2.用于条件判断的条件,这个条件必须改变,能够达到停止的 目的。

实例

用递归函数打印出0到10

1
2
3
4
5
6
7
8
9
10
static void Fun(int a){
if(a>10){
return;
}
Console.WriteLine(int a);
++a;
Fun(a);
}
//下面是调用的主函数模块。
Fun(0);

函数二
https://gaster44.github.io/2023/11/23/函数二/
作者
huangjinhong
发布于
2023年11月23日
许可协议