C#学习第五天 方法和方法的高级参数

本文深入探讨了C#中的函数概念、语法及应用,包括参数、返回值、调用过程、return关键字的双重用途,以及高级参数如out、ref、params的使用。同时,介绍了函数的重载、递归特性,并通过实例展示了如何实现递归解决文件查找问题。此外,还详细讲解了函数的调用问题和全局变量的模拟方法。


1.方法(函数)

概念:函数是将一堆代码进行重用的一种机制。函数就是一段代码,这段代码可能有输入的值(参数),可能会返回值。

一个函数就像一个专门做这件事的人,我们调用它来做一些事情,它可能需要我们提供一些数据给它,执行完后可能会返回执行结果给我们

要求的数据叫参数,返回的执行结果为返回值

string s = Console.ReadLing(); 就是没有参数也没有返回值的函数

Console.WriteLine("hello");  就是一个有参数没有返回值的函数,只有告诉函数要打印什么内容,它才能完成打印这个动作

i = Convert.ToInt32("22"); 则是一个有参数有返回值的函数,

有了函数,写代码就像堆积木一样,C#中各种各样的技术其实就是通过for、if等这些基础的语法将不同的函数按照一定的逻辑组织起来

函数的语法:

[public] static 返回值类型 函数名([参数列表])

{

方法体;

}

public :访问修饰符

static:静态的

返回值类型:返回值的类型  int、string、bool....,如果不需要返回值写void

函数名:Pascal命名规则(每个单词首字母大写)

参数列表:完成这个函数所必须提供给这个方法的条件. 如果没有参数,小括号也不能省略

函数写好后,要想被执行,必须要在Main函数中调用

调用函数:类名.函数名

***在某些情况下,类名可省略:如果你写的函数与main函数同在一个类中时可省略


2.return:有两个作用

1.在函数中返回要返回的值

2.立即结束本次函数


3.函数的调用问题

1)我们Main()函数中调用test()函数,Main()函数称为调用者,test()称为被调用者

如果被调用者test()想要得到调用者Main()的值,有两种方法:1.传递参数;2使用静态字段来模拟全局变量

如果调用者Main()想要得到被调用者test()的值,有一种方法:1.返回值;


4.方法的高级参数:out、ref、params

1) out参数:如果你在一个方法中,返回多个相同类型的值时,可以考虑返回一个数组,即用数组表示函数返回值类型。

但是如果返回多个不同类型的值的时候,返回数组就不行了,这个时候我们可以考虑out参数

out参数就侧重于在一个方法中可以返回多个不同类型的值

下面的例子是用out参数返回多个值

/// <summary>
	/// 计算一个整数数组的最大值、最小值、总和、平均值
	/// </summary>
	/// <param name="nums">要求值的数组</param>
	/// <param name="max">多余返回的最大值</param>
	/// <param name="min">多余返回的最小值</param>
	/// <param name="sum">多余返回的总和</param>
	/// <param name="avg">多余返回的平均值</param>
	public static void Test(int[] nums,out int max,out int min,out int sum,out int avg)
	{
		//out参数要求在方法的内部必须为其赋值
		max = nums[0]; min = nums[0]; sum = 0;
		for(int i=0;i<nums.Length;i++)
		{
			if(nums[i]>max)
				max = nums[i];
			if(nums[i]<min)
				min = nums[i];
			sum += nums[i];
		}
		avg = sum/nums.Length;
	}
	
然后在Main函数中:

int[] nums = {1,2,3,4,5,6,7,8,9};
		int max2,min2,sum2,avg2;
		Test(nums,out max2,out min2, out sum2,out avg2);
		//这几个值在方法中被赋值
结果为:9,1,45,5

2)ref参数:能够将一个变量带入函数中进行改变,改变完成后,再讲改变的值带出函数,返回mian函数中
不使用中间变量,交换两个变量的值: 加入n1 =x;n2 =y。 n1 = n1-n2  (n1=x-y,n2=y)  ---> n2=n2+n1  (n1 =x-y,n2=x) --->n1=n2-n1 (n1=y,n2=x)

在改变函数中参数值得时候,主函数中的实参也同样改变。用法与out相似

ref参数在函数外一定要赋值,函数内可以不赋值


3)params参数 :可变参数

将实参列表中跟可变参数数组类型一致的元素都当做数组的元素去处理。

public static void Test(string name,params int[] score)
	{
		int sum = 0;
		for(int i=0;i<score.Length;i++)
			sum += score[i];
		Console.WriteLine("{0}这次考试成绩的总和是{1}",name,sum);
	}
Main函数中:

Test("张三",99,88,77);
		Console.ReadKey();
输出为:张三这次考试成绩的总和是264,。 上述代码的99,88,77被当做了score数组的元素来处理了。并且可变,在加几个元素依然可以自动变成数组的元素来处理

注意:params必须是形参列表中的最后一个参数,而且必须只能有一个。


5.方法的重载:指的是方法的名称相同,但是参数不同.

参数不同分为两种情况:

1)类型不同

2)个数不同

***方法的重载与返回值没有关系,只与参数有关系!


6.方法的递归: 方法自己调用自己

例:找出一个文件夹中所有的文件的方法---如果文件夹中还有文件夹,调用自己,再次找文件夹中的文件....

递归类似于死循环,所以需要有一个满足跳出循环的条件.

注意:递归相当于圆圈,10层递归说明有10层圆圈里面,return后,也要经过10层圆圈才能回到Main()函数!


7. 方法的综合练习:

提示用户输入两个数字,计算两个数字之间所有整数之和   1、用户只能输入数字 ;2、如果第一个数字比第二个数字大,就重新输入 3、计算两个数字之间的和

/// <summary>
	/// 计算两个数字之间的和
	/// </summary>
	/// <param name="n1">第一个数字</param>
	/// <param name="n2">第二个数字</param>
	/// <returns>两个数字之间的和</returns>
	public static int GetSum(int n1,int n2)
	{
		int sum = 0;
		for(int i=n1;i<=n2;i++)
		{
			sum += i;
		}
		return sum;
	}
	
	/// <summary>
	/// 2、如果第一个数字比第二个数字大,就重新输入
	/// </summary>
	/// <param name="n1">第一个数字</param>
	/// <param name="n2">第二个数字</param>
	public static void JudgeNumber(ref int n1,ref int n2)
	{
		while(true)
		{
			if(n1<n2)
			{
				return; //符合题意
			}
			else
			{
				Console.WriteLine("第一个数字不能大于等于第二个,请重新输入第一个数字:");
				string s1 = Console.ReadLine();
				//调用GetNumber,重新取值
				n1 = MyClass.GetNumber(s1);
				Console.WriteLine("请重新输入第二个数字:");
				string s2 = Console.ReadLine();
				n2 = MyClass.GetNumber(s2);
			}
		}
	}
	
	/// <summary>
	/// 把输入的字符串转成数字,如果不是数字,则重新输入
	/// </summary>
	/// <param name="s">输入的字符串</param>
	/// <returns>转换成功的数字</returns>
	public static int GetNumber(string s)
	{
		while(true)
		{
			try
			{
				int num = System.Convert.ToInt32(s);
				return num;
			}
			catch
			{
				Console.WriteLine("输入有误!!请重新输入:");
				s = Console.ReadLine();
			}
		}
	}

主函数:

#region  方法综合练习题1
		
		//提示用户输入两个数字,计算两个数字之间所有整数之和
		//1、用户只能输入数字 ;2、如果第一个数字比第二个数字大,就重新输入
		//3、计算两个数字之间的和
		Console.WriteLine("请输入第一个数字:");
		string strNumberOne = Console.ReadLine();
		int numOne = MyClass.GetNumber(strNumberOne); //调用方法1,确认只能输入数字
		Console.WriteLine("请输入第二个数字:");
		string strNumberTwo = Console.ReadLine();
		int numTwo = MyClass.GetNumber(strNumberTwo);
		JudgeNumber(ref numOne,ref numTwo); //调用方法2,确定第一个数比第二个小
		int sum = GetSum(numOne,numTwo); //调用方法3,求两个数之间的和
		Console.WriteLine("{0}到{1}之间的和为:{2}",numOne,numTwo,sum);
		Console.ReadKey();
		
		#endregion









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值