C#从零开始学习笔记---第十一天
ok啊,上次我们对如何定义一个类和如何声明一个类的对象做了一个具体的记录,那么这次我们就记录一下类的其他相关内容,比如里面的方法,来看看他如何定义,如何调用,以及他的参数。话不多说,我们直接开始!
1.方法的定义与调用
方法就是我们常说的函数,说白了就是解决问题的一种方式。在C#中,方法是一段可重复使用的代码块,用于执行特定任务。方法可以接收输入参数,处理这些参数,并返回结果。方法的主要目的是将代码模块化,提高可读性和复用性。然后方法一般由方法名,参数列表,返回类型和方法体四个部分组成。因为他的这个组成结构,所以我们的方法又可以分为四种类型:第一种是无返回值无参数,第二种是无返回值有参数,第三种是有返回值无参数,第四种是由返回值有参数。接下来我们逐一来看这四种类型的方法。
1.1 无返回值无参数
首先我们还是通过上一次记录的创建类的方法随便创建一个类,这里我就不展示了,如果有不会的同袍可以去看看主播上一期笔记。然后我们看一下无返回值,无参数的方法如何定义。
//1.无返回值无参数 public void Fun_1() { Console.WriteLine("Hello,World!"); }这段代码是干啥的呢,大家应该一眼就能看出来,就是简单打印一句Hello,World。那他该怎么调用呢?我们在上期讲类的最后也提到了怎么声明一个类的实例,因为我们现在定义的方法都是属于类的方法嘛,所以我们就通过声明一个实例打点调用就行,具体操作如下:
MyClass a= new MyClass(); a.Fun_1();顺便看一下运行结果:
1.2 无返回值有参数
依旧是再类里定义,这里我们先看看有参数是什么情况,至于参数是咋回事我们会在下面详细分解。
//2.无返回值有参数 public void Fun_2(string s) { Console.WriteLine("您有一条新的消息:{0}",s); }当然,这里简单提一下,这个方法里的string s就是参数,说明我们要给这个方法传递一个字符串s这个方法才能被使用,换言之这个字符串s就是打开这个方法的钥匙。当然,在方法的括号里的这个参数我们也不是真正存在的,我们叫他形式参数,它相当于就是一个膜具吧,我们要拿一个真实存在参数的给这个方法我们才能用这个方法。而这个真是存在的参数我们叫做实际参数。我们在调用里看:
MyClass a= new MyClass(); string s = "别感冒"; a.Fun_2(s);在这里我们定义的一个“别感冒”就是实际的参数,我们把这个实际的参数给到我们的方法Fun_2,这样就能调用它,我们来看结果:
1.3 有返回值无参数
这个类型的就是我们不需要传递参数,但需要再函数里返回一个值给用户使用。
//3.有返回值无参数 public string Fun_3() { string s = "TO BE BETTER!"; return s; }他的调用方式和上面的都是一样的,具体操作如下:
MyClass a= new MyClass(); string ss = a.Fun_3(); Console.WriteLine(ss);这里为什么要定义一个ss呢?因为我们这里返回给主函数的是一个值,我们一定时要用到的。这个值你要么把他存起来,要么把他打印出来,不然你返回他干嘛,对不对?这里就是把他的返回值重新赋给了ss,我们来看一下结果:
1.4 有返回值有参数
有返回有参数的方法才是平时我们经常会用到的,经过了上面的铺垫,我相信大家肯定能轻松的掌握它,具体是怎么定义呢?这里我们假设来定义一个求矩形面积的方法,并借此来看一下这个到底该怎么定义:
// 4.有返回值有参数 public double Fun_4(double a,double b) { double mianji = a * b; return mianji; }在这个方法里,我们要传入两个值给它,我们想一下为什么?要求一个矩形的面积,我们是不是得告诉他矩形的长和宽,只有这样才能求出他面积嘛,所以我们这里就传入两个值。方法体里就是一个简单的乘积,然后把这个乘积返回出去就行。我们来看一下他的调用:
MyClass a= new MyClass(); double length = 5; double wide = 18; double S = a.Fun_4(length, wide); Console.WriteLine($"长为{length}宽为{wide}的长方形的面积为{S}");同样和1.3一样,因为有返回值嘛,所以我们要用一个变量把这个返回值存起来,或者你就直接打印,不然不就没意义了。这里我们用一个S把返回来的面积存起来,然后再把结果打印出来,打印结果如下:
2.方法的参数
在记录方法的参数之前我们先来做一道题:定义一个方法来实现交换两个参数的值。大家思考一下这个该怎么做呢?ok,直接来看我怎么做:
//定义一个方法来实现交换两个参数的值 public void Exchaneg(int a,int b) { int temp = a; a = b; b = temp; }我们来看一下我这个逻辑对不对,定义一个中间变量来记录a的值然后把b的值赋给a,再把temp的值赋给b,以此在实现交换,是不是没毛病,ok,那下面我们调用一下:
MyClass a= new MyClass(); int m = 3; int n = 5; Console.WriteLine($"m的值为{m},n的值为{n}"); a.Exchaneg(m,n); Console.WriteLine($"m的值为{m},n的值为{n}");我们直接来看结果:
ok啊,大败而归。为什么啊,这就要引出我们接下来要记录的内容了。
2.1 ref参数的使用
不知道大家对之前记录过的值类型和引用类型还有没有印象。这里简单的再提一下,值类型的话存储在栈中,我们在用它的时候相当于是给他复制了一次,把复制的副本拿过来用了,并没有去改变它本身,而引用类型的话存储在堆中,我们如果对引用类型进行操作的时候直接拿到是他的地址,所以会直接改变这个地址里的值,即改变一个变量可能会导致所有变量都改变。而上面的例子之所以会失败,就是因为我们对他的操作本质上还是值类型的操作,不管我们怎么改变函数里a和b的值,我们都是拿来的m和n的副本进行操作的,本质上不会改变m和n的值。而我们通过使用ref这个参数,就可以实现引用传递,今儿改变m和n的值。具体操作如下:
//定义一个方法来实现交换两个参数的值 public void Exchaneg(ref int a,ref int b) { int temp = a; a = b; b = temp; }在上面的代码种我们传参的时候传送的是实参的地址,这样的话我们改变的就会是这个地址里存放的内容,所有指向这个地址的变量都会被改变。调用过程和之前一样,只不过也要加上ref。
MyClass a= new MyClass(); int m = 3; int n = 5; Console.WriteLine($"m的值为{m},n的值为{n}"); a.Exchaneg(ref m,ref n); Console.WriteLine($"m的值为{m},n的值为{n}");我们来看一下结果:
m和n的值最后成功调换了,是不是很神奇,这就是传值和传地址的区别。
2.2 out参数的使用
out 参数用于在方法中返回多个值,允许方法通过参数返回数据而不需要返回值。out 参数必须在方法内部赋值,调用时也需要使用 out 关键字显式声明。我们来看个例子:
void Calculate(int a, int b, out int sum, out int product) { sum = a + b; product = a * b; } int x, y; Calculate(5, 3, out x, out y); Console.WriteLine($"Sum: {x}, Product: {y}");在这个函数里我们定义了一个求和运算和一个乘积运算,但我们并没有要求方法给我返回值,其主要原因就是我们用到了out参数,这样我们就可不不通过返回值反而也能得到最终的结果。
2.3 params参数的使用
params 关键字允许方法接受可变数量的参数,参数必须是数组类型。调用时可以传递任意数量的参数,编译器会自动将它们封装为数组。
void PrintNumbers(params int[] numbers) { foreach (var num in numbers) { Console.WriteLine(num); } } PrintNumbers(1, 2, 3); // 输出 1, 2, 3 PrintNumbers(4, 5); // 输出 4, 5params 参数必须是方法的最后一个参数,且一个方法只能有一个 params 参数。适用于需要处理不确定数量参数的场景。
3 方法的分类
类的方法一般分为静态的方法(static)和非静态的方法(普通的),我们平时用的更多的是普通的方法。像我们上面定义的方法都是普通的方法。静态的方法具体的定义方式就是在原来的方法类型前加一个static,我们来看一下:
public static void Change() { Console.WriteLine("---"); }但是我们在主函数里通过实例就不能调用这个方法,只有通过它所属的类来进行调用:
MyClass a= new MyClass(); a.Change(); //无法调用 MyClass.Change(); //可以调用总而言之,就是通过类来访问静态的方法,通过实例来调用普通的方法。而静态方法和普通方法也只有在调用这点有点区别,别的都没什么区别。
其实最后还有一点是方法的重载,但是我们在第七天的时候已经介绍过了,这里就不再重复了,其实挺简单的,大家可以再去看一下我的那篇博客,今天就到这了,我们下次见!!
