函数一

关于函数(一)

一.函数基础

基本概念

函数(方法function),本质是一块具有名称的代码块,函数是封装代码进行重复使用的一种机制。

函数的主要作用:封装代码;提升代码复用率(少写一点代码);抽象行为

函数写在哪里

1.class语句块中

2.struct(复杂数据类型结构体)语句块中

基本语法

static 返回类型 函数名 (参数类型 参数名,参数类型 参数名,……)

{

函数代码逻辑;

函数代码逻辑;

………….

return 返回值;(如果有返回类型才返回)

}

Ps:1.关于static,不是必须的,但是在没有学习类和结构体之前,都是必须写的。

2.关于返回类型,引出一个新的关键字 void(表示没有返回值)

3.返回类型可以写任意的变量类型 14中变量类型+复杂数据类型(数组,枚举,结构体,类class)

4.关于函数名,要使用帕斯卡命名法(每一个单词首字母大写)

5.参数表示必须的,可以有0~n个参数,参数类型也可以是任意类型的,多个参数的时候,需要逗号隔开。

6.参数名 驼峰命名法

7.当返回类型不为void时,必须通过新的关键词return返回对应类型的内容。(注意:即使是void也可以选择性使用return)

实际运用

无参无返回值函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace 语法知识
{
internal class Program
{
static void SayHellow(){
Console.WriteLine("你好世界");
return;
//return可以省略,因为返回类型是void。
}
static void Main(string[] args)。
{
//使用函数直接写函数名(参数)即可。
sayHeollow();
}
}
}

有参无返回值函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace 语法知识
{
internal class Program
{
static void SayYourName(string name){
Console.WriteLine("你的名字是:{0}",name);
//return同样省略。
}
static void Main(string[] args)。
{
//参数可以是常量,变量,函数都可以。
//参数一定是传一个能够得到对应类型的表达式。
string str="我的名字";
SayYouName(str);
SayYouName("我的名字");
}
}
}

无参有返回值函数

之后的内容就不放在主函数中运用了。

1
2
3
4
5
6
7
8
static string WhatYourName(){
return "我的名字";
}
//这个函数可以与上面的一个函数嵌套运用。
SayYourName(WhatYourName());
//最后输出“你的名字是:我的名字”。
//有返回值的函数,要不直接拿返回值来用,要不就是拿变量接受它的结果。
//也可以直接调用,但是返回值对我们来说就没用了。

有参有返回函数

1
2
3
4
5
6
7
8
static int Sum(int a,int b)
{
int c=a+b;
return c;
//或者return a+b;
}
调用:
Console.WriteLine(Sum(2,5));

有参有多返回值函数(这个和C很不一样!!)

传入两个数,然后计算两个数的和,以及他们俩的平均数,得出结果返回出来。

1
2
3
4
5
6
7
8
9
10
11
static int[] Calc(int a,int b)
{
int sum=a+b;
int avg =sum/2;
int arr={sum,avg};
return arr;
//或者 return new int[]{sum,avg};
//如果数组作为返回值出去,那么前提是使用者知道这个数组的规则。
}
int [] arr =Calc(5,7);
Console.WriteLine(arr[0]+" "+arr[1]);

关于return

即使函数没有返回值,我们也可以使用return。

return可以直接不执行之后的代码,直接返回到函数外部。

1
2
3
4
5
6
static void Speak(string str){
if(str=="混蛋"){
return;
}
Console.WriteLine(str);
}

二.关于ref和out

学习ref和out的原因

它们可以解决在函数内部改变外部传入的内容,里面变了,外面也要变。

eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace 语法知识
{
internal class Program
{
static void ChangeArrayValue(int[] arr){
arr=new int[]{10,20,30};
//重新申明了一个数组。
}
static void Main(string[] args)。
{
int a=1;
int [] arr2={1,2,3};
ChangeArrayValue(arr2);
Console.WriteLine(arr2[0]);
}
}
}
//打印的是1,并不会改变,即使int[]数组是引用类型。但是在函数中,arr被改变了地址,导致arr和arr2没有关系,之后的改变也就没有关系了。

ref和out是为了解决这个问题的(也能解决值类型在函数里面无法修改的状况。)

ref和out的使用

函数参数的修饰符,当传入得到值类型参数在内部修改时,或者引用类型参数在内部重新申明时,外部的值会发生变化。

ref的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
namespace 语法知识
{
internal class Program
{
static void ChangeValueRef(ref int value){
value=3;
}
static void Main(string[] args)。
{
int a=1;
ChangeValueRef(ref a);
Console.WriteLine(a);
}
}
}
//可以发现,a在函数块里面被成功修改了,变成3了。
//数组同理,如果是函数里面新数组的状况,也是在括号变量前面加上ref。

out的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace 语法知识
{
internal class Program
{
static void ChangeValueRef(out int value){
value=3;
}
static void Main(string[] args)。
{
int a=1;
ChangeValueRef(out a);
Console.WriteLine(a);
}
}
}
//值也被改变了。

二者的使用和声明几乎是一样的,那么二者有什么区别呢?

ref和out的区别

1.ref传入的变量必须初始化,而out不用。

2.out传入的变量必须在内部进行赋值,ref不用。

1
2
3
4
5
6
int a;
ChangeValueRef(ref a);
//报错。
ChangeValueRef(out a);
//不报错
//第二点同理,二者其实是相互配对的,out在外部不用初始化,但与之相对的,必须在函数块内赋值(相当于初始化操作)

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