(一)方法/函数的调用问题
被调用函数想要得到调用者的值:
- 传入参数;
- 使用静态字段来模拟全局变量;
C#中没有全局变量这个概念,但是使用静态字段来模拟全局变量;
在类和函数之间:
//字段, 属于类的字段
public static int _number = 10;
调用者得到被调用者的值
- 返回值;
- 使用out参数(详见下面)
- 数组例外
被调用函数的参数是形参,调用者传入的是实参;但是都是在内存中开辟空间的;
注意:
- 方法的功能一定要单一;
- 方法中最忌讳提示用户的字眼;因为这个东西只能用在控制台;
(二)out、ref 和 Params 参数的使用
(1)out参数的使用
一个方法中,返回多个相同类型的值,可以使用数组;当需要返回多个不同类型的值时,考虑使用out参数;
public static void Main(string[] args)
{
int[] nums = {1, 2, 3, 78, 56, 45, 85};
int max = 0; // 可以先不赋值
int min = 0; // 可以与被调用函数不同
int sum = 0;
int avg = 0;
Test(nums, out max, out min, out sum, out avg);
Console.WriteLine(max, min, sum, avg);
}
// 带out的参数是多余返回的值
public static viod Test(int[], 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;//不需要return
}
(2)ref参数的使用
ref 参数实现类似C++中取地址的作用,这样,在被调用函数中的操作,都是在实参上进行的操作,不用返回值,就可以在实参上发生变化;
要求方法外必须赋值,方法内可以不赋值;
static void Main(string[] args)
{
int x = 0, y = 0;
Console.WriteLine("请输入两个数字:");
try
{
x = Convert.ToInt32(Console.ReadLine());
y = Convert.ToInt32(Console.ReadLine());
}
catch
{
Console.WriteLine("输入错误!");
return;
}
Exchange(ref x, ref y);
Console.WriteLine(x);
Console.WriteLine(y);
}
/// <summary>
/// 这个函数实现交换两个int型的变量
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
public static void Exchange(ref int a, ref int b)
{
int temp = a;
a = b;
b = temp;
}
(3)params参数的使用
params是可变参数;将实参列表中,与可变参数数组类型一致的元素都当做数组的元素处理;
static void Main(string[] args)
{
Test("zhangSan", 99, 88, 56);
}
// 下面的参数,既可以传数组,也可以传入多个int
// 可变参数数组必须是形参列表中的最后一个;
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);
}
- 可变参数数组必须是形参列表中的最后一个;
- 可变参数数组不能同时使用多个;
(三)方法的重载
方法的重载指的是方法的名称相同,但是参数不同;这样可以方便调用;在调用的时候,可以根据传入参数的差别调用不同的方法;
实际上Console.WritelLine()这个就使用了重载,这样可以打印不同类型的数据;
注意:
- 如果参数个数相同,则参数的类型不可相同;
- 参数类型相同,则参数的个数不能相同;
- 方法的重载和返回值没有关系;
(四)方法的递归
即是方法自己调用自己
注意:
- 要有递归体;
- 要有跳出递归的条件;不能无止境调用;