ok啊上次我们对如何定义一个类和如何声明一个类的对象做了一个具体的记录那么这次我们就记录一下类的其他相关内容比如里面的方法来看看他如何定义如何调用以及他的参数。话不多说我们直接开始1.方法的定义与调用方法就是我们常说的函数说白了就是解决问题的一种方式。在C#中方法是一段可重复使用的代码块用于执行特定任务。方法可以接收输入参数处理这些参数并返回结果。方法的主要目的是将代码模块化提高可读性和复用性。然后方法一般由方法名参数列表返回类型和方法体四个部分组成。因为他的这个组成结构所以我们的方法又可以分为四种类型第一种是无返回值无参数第二种是无返回值有参数第三种是有返回值无参数第四种是由返回值有参数。接下来我们逐一来看这四种类型的方法。1.1 无返回值无参数首先我们还是通过上一次记录的创建类的方法随便创建一个类这里我就不展示了如果有不会的同袍可以去看看主播上一期笔记。然后我们看一下无返回值无参数的方法如何定义。//1.无返回值无参数 public void Fun_1() { Console.WriteLine(Hello,World!); }这段代码是干啥的呢大家应该一眼就能看出来就是简单打印一句HelloWorld。那他该怎么调用呢我们在上期讲类的最后也提到了怎么声明一个类的实例因为我们现在定义的方法都是属于类的方法嘛所以我们就通过声明一个实例打点调用就行具体操作如下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(); //可以调用总而言之就是通过类来访问静态的方法通过实例来调用普通的方法。而静态方法和普通方法也只有在调用这点有点区别别的都没什么区别。其实最后还有一点是方法的重载但是我们在第七天的时候已经介绍过了这里就不再重复了其实挺简单的大家可以再去看一下我的那篇博客今天就到这了我们下次见