定义和使用函数
用函数名、0或多个参数及返回值定义
控制台应用函数定义
// 定义
static <returnType> <FunctionName>(<paramType> <paramName>, ...)
{
...
return <returnValue>
}
// 例子
static double Multiply(double myVal1, double myVal2)
{
return myVal1 * myVal2;
}
返回值
- 返回值可以是任意类型
- 无返回值时, void 声明指定
- 有返回值时, return 返回值
- return 执行时,程序立即返回调用代码处,return 后面的代码不会执行
// 表达式体定义函数,适用于只有一行代码的函数
static double Multiply(double myVal1, double myVal2) => myVal1 * myVal2;
参数
- 参数可以是任意类型
参数匹配
调用函数时,提供的参数类型、顺序及个数,必须与函数的定义相同
参数数组
- 表示个数不确定的特定类型的参数时使用
- params 必须是最后一个参数, 并且只有一个
// 定义
static <returnType> <FunctionName>(<paramType> <paramName>, ..., params <type>[] <name>)
{
...
return <returnValue>
}
// 举例
static int SumVals(int noneInt, params int[] vals)
{
int sum = 0;
foreach (int val in vals)
{
sum += val;
}
return sum;
}
static void Main(string[] args)
{
int sum = SumVals(0, new int[] {1, 5, 2, 9, 8});
Console.WriteLine($"Summed Values = {sum}");
Console.ReadKey();
}
引用参数
ref 参数必须是变量,变量必须初始化
// 定义
static <returnType> <FunctionName>(ref <paramType> <paramName>, ...)
{
...
return <returnValue>
}
// 例子
static int SumVals(ref int sum, params int[] vals)
{
foreach (int val in vals)
{
sum += val;
}
return sum;
}
static void Main(string[] args)
{
int refSum = 0;
int sum = SumVals(ref refSum, new int[] { 1, 5, 2, 9, 8 });
Console.WriteLine($"Summed Values = {sum}");
Console.ReadKey();
}
输出参数
调用时,out 参数未赋值或已赋值均可,但函数执行时,其中存储的值会丢失
static int MaxValue(int[] intArray, out int maxIndex)
{
int maxVal = intArray[0];
maxIndex = 0;
for (int i = 0; i < intArray.Length; i++)
{
if (intArray[i] > maxVal)
{
maxVal = intArray[i];
maxIndex = i;
}
}
return maxVal;
}
static void Main(string[] args)
{
int[] myArray = {1, 8, 3, 6, 2, 5, 9, 3, 0, 2};
int maxIndex;
Console.WriteLine($"The maximum value is myArray is {MaxValue(myArray, out maxIndex)}");
Console.WriteLine($"The first occurrence of this value is at element {maxIndex + 1}");
}
变量的作用域
使用 static, const 关键字定义全局作用局的变量。const 可以修改。
其它结构中变量的作用域
- 循环内引用循环外的变量时,变量必须定义并初始化。
int i;
string text;
for (i = 0; i < 10; i++)
{
text = "Line" + Convert.ToString(i); // 报错,使用前 text 未初始化
Console.WriteLine($"{text}")
}
Console.WriteLine($"Last text output in loop: {text}")
- 循环体外不能直接引用循环内定义的变量。
int i;
for (i = 0; i < 10; i++)
{
string text = "Line" + Convert.ToString(i);
Console.WriteLine($"{text}")
}
Console.WriteLine($"Last text output in loop: {text}") // 报错, 循环外 text 未定义
参数和返回值与全局数据
以下效果相同,一般情况下,最好使用参数,而不使用全局数据。
- 通过参数
static void Main(string[] args)
{
int val = 5;
Console.WriteLine($"val = {val}");
ShowDouble(ref val);
Console.WriteLine($"val = {val}");
Console.ReadKey();
}
static void ShowDouble(ref int val)
{
val *= 2;
Console.WriteLine($"val doubled = {val}");
}
- 通过全局变量
static int val;
static void Main(string[] args)
{
val = 5;
Console.WriteLine($"val = {val}");
ShowDouble();
Console.WriteLine($"val = {val}");
Console.ReadKey();
}
static void ShowDouble()
{
val *= 2;
Console.WriteLine($"val doubled = {val}");
}
Main() 函数
- 应用程序入口点,执行完成后程序结束
- 程序运行时,指定的命令行参数存放在 args 数组中
static void Main()
static void Main(string[] args)
// 以下2种方式通常用于错误提示,0 表示程序正常终止
static int Main()
static int Main(string[] args)
结构函数
struct CustomeName
{
public string firstName, lastName;
public string name() => firstName + " " + lastName; // 函数体内直接访问结构成员
}
函数的重载
可以同时声明多个名称一样的函数,根据参数类型及参数个数不同进行区分,统称为函数的签名
static double ShowDouble()
{
return 0D;
}
static void ShowDouble(ref int val)
{
val *= 2;
Console.WriteLine($"val doubled = {val}");
}
static void ShowDouble(int val)
{
val *= 2;
Console.WriteLine($"val doubled = {val}");
}
static void ShowDouble(int val, int tt)
{
val *= 2;
Console.WriteLine($"val doubled = {val}");
}
委托
- 类似函数,使用 delegate 声明,但没有函数体
- 可以做为函数的参数
- 返回值类型、参数个数及类型必须与委托的函数相同
class Program
{
delegate double MyDelegate(double param1, double param2);
static double Multiply(double param1, double param2) => param1 * param2;
static double Divide(double param1, double param2) => param1 / param2;
static void Main(string[] args)
{
MyDelegate myDelegate;
Console.WriteLine("Enter 2 numbers separated with a comma:");
string input = Console.ReadLine();
int commaPos = input.IndexOf(',');
double param1 = Convert.ToDouble(input.Substring(0, commaPos));
double param2 = Convert.ToDouble(input.Substring(commaPos + 1, input.Length - commaPos - 1));
Console.WriteLine("Enter M to multiply or D to divide:");
input = Console.ReadLine();
if (input == "M")
{
myDelegate = new MyDelegate(Multiply);
// myDelegate = Multiply;
}
else
{
myDelegate = new MyDelegate(Divide);
// myDelegate = Divide;
}
Console.WriteLine($"Result: {myDelegate(param1, param2)}");
Console.ReadKey();
}
}