之前介绍了函数,回顾一下几个知识点:
1.函数用函数名、0 个或多个参数及返回类型来定义。函数的名称和参数统称为函数的签名。可以定义名称相同、但签名不同的多个函数——也称为函数的重载。也可以在结构类型中定义函数。
2.带参函数,个数不定的特定类型的参数可以通过参数数组来指定。参数可以指定为ref 或out,以便给调用者返回值。
3.变量根据定义它们的代码块来界定其使用范围。代码块包括方法和其他结构,例如循环体。可以在不同的作用域中定义多个不同的同名变量。
4.在执行应用程序时,控制台应用程序中的Main()函数可以接收传送给应用程序的命令行参数。这些参数用空格隔开,但较长的参数可以放在引号中传送。
一、接下来我们认识一下“委托”(小编表示这个很好用):
委托(delegate)是一种可以把引用存储为函数的类型。这听起来相当棘手,但其机制是非常简单的。委托最重要的用途在后面介绍到事件和事件处理时才能解释清楚,但这里也将介绍有关委托的许多内容。委托的声明非常类似于函数,但不带函数体,且要使用delegate 关键字。委托的声明指定了一个返回类型和一个参数列表。
在定义了委托后,就可以声明该委托类型的变量。接着把这个变量初始化为与委托有相同返回类型和参数列表的函数引用。之后,就可以使用委托变量调用这个函数,就像该变量是一个函数一样。
介绍的有点抽象,我们还是来看栗子:
//定义一个委托,注意格式
delegate double ProcessDelegate(double param1, double param2);
//然后两个函数
static double Multiply(double param1, double param2)
{
return param1 * param2;
}
static double Divide(double param1, double param2)
{
return param1 / param2;
}
//主函数
static void Main(string[] args)
{
//声明一个变量process
ProcessDelegate process;
//获取两个数值
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")
//初始化process变量,把一个函数引用赋给委托变量process
process = new ProcessDelegate(Multiply);
else
process = new ProcessDelegate(Divide);
//调用这个方法
Console.WriteLine("Result: {0}", process(param1, param2));
Console.ReadKey();
}
要把一个函数引用赋给委托变量,需要使用略显古怪的语法。这个过程比较类似于给数组赋值,
必须使用new 关键字创建一个新委托。在这个关键字的后面,指定委托类型,提供一个引用所需函数的参数,该函数是Multiply()或Divide()。注意这个参数与委托类型或目标函数的参数不匹配,这是委托赋值的一个独特语法,参数是要使用的函数名,且不带括号。
这里可以使用略微简单的语法:
if (input == "M")
process = Multiply;
else
process = Divide;
有了引用函数的变量后,还可以执行不能用其他方式完成的操作。例如,可以把委托变量作为参数传递给一个函数,这样,该函数就可以使用委托调用它引用的任何函数,而且在运行之前无需知道调用的是哪个函数
例如,通过参数将其传递给个函数,这个函数的一个简单示例如下:
static void ExecuteFunction(ProcessDelegate process)
{
process(2.2, 3.3);
}
委托是用返回类型和参数列表定义的变量。给定的委托类型可以匹配返回类型和参数与委托定义相同的方法