函数的调用
我们在Main()函数中,调用其它函数,我们称Main()函数为调用者,称其它函数为被调用者
如果被调用者想要得到调用者的值:
- 传递参数
- 使用静态字段来模拟全局变量
如果调用者想要得到被调用的值需要使用返回值
class Program
{
public static string _str = "";
static void Main(string[] args)
{
Console.WriteLine("请输入一个年份");
int year = Convert.ToInt32(Console.ReadLine());
Year(year);
Console.WriteLine("{0}年{1}",year,_str);
Console.ReadKey();
}
/// <summary>
///判断给定的年份是否是闰年
/// </summary>
/// <param name="year">要判断的年份</param>
public static void Year(int year)
{
_str = (year % 4 == 0 & year % 100 != 0) || year % 400 == 0 ? "是闰年" : "不是闰年";
}
}
实参与形参
实参与形参都会在内存里开空间
方法的功能一定要单一
方法中最忌讳的就是出现提示用户输入
static void Main(string[] args)
{
//Console.WriteLine("请输入一个数字");
//string number = Console.ReadLine();
//int mn = GeTNumber(number);
//Console.WriteLine(mn);
//Console.ReadKey();
//Console.WriteLine("请输入yes或者no");
//string str = Yn(Console.ReadLine());
//Console.WriteLine(str);
int[] nums={1,2,3,4,5,6,7,8,9};
int sum=SumNums (nums);
Console.WriteLine(sum);
Console.ReadKey();
}
/// <summary>
/// 如果用户输入数字则返回数字,如果不是则提醒用户重新输入
/// </summary>
/// <param name="str">用户输入的字符串</param>
/// <returns>返回值</returns>
public static int GeTNumber(string str)
{
while (true)
{
try
{
int number = Convert.ToInt32(str);
return number;
}
catch
{
Console.WriteLine("输入的不是数字,请重新输入");
str = Console.ReadLine();
}
}
}
/// <summary>
/// 限定用户只能输入yes或者no
/// </summary>
/// <param name="input">用户输入的字符串</param>
/// <returns>返回值</returns>
public static string Yn(string input)
{
while (input != "yes" && input != "no")
{
Console.WriteLine("输入的不是yes或者no,请重新输入");
input = Console.ReadLine();
}
return input;
}
/// <summary>
/// 求数组的和
/// </summary>
/// <param name="nums">需求和数组</param>
/// <returns>返回的数组和</returns>
public static int SumNums(int[] nums)
{
int sum = 0;
for (int i = 0; i < nums.Length ; i++)
{
sum+=nums[i];
}
return sum;
}
out、ref、param
(1)out参数
如果你在一个方法中,返回多个相同类型的值的时候,可以考虑返回一个数组。但是如果返回多个不同类型的值的时候,返回数组就不行了,那么这个时候,我们可以考虑使用out参数
out参数侧重于在一个方法中可以返回多个不同类型的值
static void Main(string[] args)
{
//int[] nums = { 9, 1, 3, 7, 8, 5, 4, 6, 2, 0 };
//int[] res = GetMaxMinSumAverage(nums);
//Console.WriteLine("最大值是{0},最小值是{1},总和是{2},平均值是{3}", res[0], res[1], res[2], res[3]);
//Console.ReadKey();
int[] nums = { 9, 1, 3, 7, 8, 5, 4, 6, 2, 0 };
int max;
int min;
int sum;
int average;
GetM(nums, out max, out min, out sum, out average);
Console.WriteLine("最大值是{0},最小值是{1},总和是{2},平均值是{3}", max, min, sum, average);
Console.ReadKey();
}
/// <summary>
/// 求给定数组的最大值、最小值、总和、平均值,假定rev【0】为最大值,rev【1】为最小值,rev【2】是总和,rev【3】是平均值
/// </summary>
/// <param name="nums">指定的数组</param>
/// <returns>返回的最大值、最小值、总和和平均值组成的数组</returns>
public static int[] GetMaxMinSumAverage(int[] nums)
{
int[] rev = new int[4];
rev[0] = nums[0];
rev[1] = nums[0];
rev[2] = 0;
for (int i = 0; i < nums.Length; i++)
{
if (nums[i] > rev[0])
{
rev[0] = nums[i];
}
else if (nums[i] < rev[1])
{
rev[1] = nums[i];
}
rev[2] += nums[i];
}
rev[3] = rev[2] / nums.Length;
return rev;
}
/// <summary>
/// 计算一个整数数组的最大值、最小值、总和、平均值
/// </summary>
/// <param name="nums">需求数组</param>
/// <param name="max">数组中的最大值</param>
/// <param name="min">数组中的最小值</param>
/// <param name="sum">数组的和</param>
/// <param name="average">数组的平均值</param>
public static void GetM(int[] nums, out int max, out int min, out int sum, out int average)
{
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];
}
average = sum / nums.Length;
}
(2)ref参数
能够将一个变量带入一个方法中进行改变,改变完成后,再将改变后的值带出方法,要求方法外必须为变量赋值,方法内可以不赋值
static void Main(string[] args)
{
//使用方法来交换两个int类型的变量
int n1 = 10;
int n2 = 20;
Exchange(ref n1, ref n2);
Console.WriteLine(n1);
Console.WriteLine(n2);
Console.ReadKey();
}
public static void Exchange(ref int n1, ref int n2)
{
int temp = n1;
n1 = n2;
n2 = temp;
}
params可变参数
将实参列表中跟可变参数数组类型一致的元素都当做数组的元素去处理
params可变参数必须是形参列表中的最后一个元素
static void Main(string[] args)
{
int sum= GetSum(21, 33, 37, 21, 46, 12);
Console.WriteLine(sum);
Console.ReadKey();
}
/// <summary>
/// 求任意长度整数数组的和
/// </summary>
/// <param name="n">所求整数数组</param>
/// <returns>返回数组的和</returns>
public static int GetSum(params int[] n)
{
int sum = 0;
for (int i = 0; i < n.Length ; i++)
{
sum += n[i];
}
return sum;
}
## 方法的重载
概念:方法的重载指的是方法的名称相同,但是参数不同
参数不同,分为两种情况
- 如果参数的个数相同,那么参数的类型就不能相同
- 如果参数的类型相同,那么参数的个数就不能相同
方法的重载和返回值没有关系
方法的递归
方法自己调用自己