委托

6 本我 3周前 161次点击

委托(delegate)是一种存储函数引用的类型。委托最重要的用途在后面介绍到事件和事件处理时才能解释清楚,委托的声明非常类似于函数,但不带函数体,且要使用delegate关键字。委托的声明指定了一个返回类型和一个参数列表。

定义了委托后,就可以声明该委托类型的变量。接着把这个变量初始化为与委托具有相同返回类型和参数列表的函数引用。之后,就可以使用委托变量调用这个函数,就像该变量是一个函数一样。

有了引用函数的变量后,就可以执行无法用其他方式完成的操作。例如,可以把委托变量作为参数传递给一个函数,这样,该函数就可以使用委托调用它引用的任何函数,而且在运行之前不必知道调用的是哪个函数。

示例

class Program

{

//定义委托:我的委托

delegate double 我的委托(double param1, double param2);

//定义函数乘()和除()

static double 乘(double param1, double param2) => param1 * param2;

static double 除(double param1, double param2) => param1 / param2;

static void Main(string[] args)

{

//声明变量:委托

我的委托 委托;

//提示输入两个由逗号分隔的数字,并放入两个double变量中

WriteLine("输入两个用逗号分隔的数字");

string 输入 = ReadLine();

int 逗号 = 输入.IndexOf(',');

double param1 = Convert.ToDouble(输入.Substring(0,逗号));

double param2 = Convert.ToDouble(输入.Substring(逗号+1,输入.Length-逗号-1));

//提示输入m或其他进行乘、除

WriteLine("输入“m”进行乘法,输入其他进行除法");

输入 = ReadLine();

if (输入 == "m")

{

//初始化委托变量

委托 = new 我的委托(乘);

}

else

{

委托 = new 我的委托(除);

}

//通过委托调用函数

WriteLine($"结果={委托(param1,param2)}");

ReadKey();

}

}

要把一个函数引用赋给委托变量,需要使用特殊语法。这个过程比较类似于给数组赋值,必须使用new关键字创建一个新委托。在这个关键字的后面,指定委托类型,提供一个引用所需函数的参数,这里也就是乘()或除()函数。注意这个参数与委托类型或目标函数的参数不匹配,这是委托赋值的一种独特语法,参数是要使用的函数名且不带括号。

实际上,这里可以使用略微简单的语法:

if(输入=="m")

委托=乘;

else

委托=除;

编译器会发现,委托变量的委托类型匹配两个函数的签名,于是自动初始化一个委托。可以自行确定使用哪种语法,但一些人喜欢使用较长的版本,因为它更容易一眼看出会发生什么。

这里把委托变量看成一个函数名。但与函数不同,我们还可以对这个变量执行更多操作,例如,通过参数将其传递给一个函数,如下例所示:

class Program

{

//定义委托

delegate double 我的委托(double param1, double param2);

//定义函数

static double 乘(double param1, double param2) => param1 * param2;

static double 功能(我的委托 委托) => 委托(2.2,3.3);

static void Main(string[] args)

{

//声明变量并初始化

我的委托 委托=乘;

//调用函数

WriteLine($"结果={功能(委托)}");

ReadKey();

}

}

就像选择一个要使用的“插件”一样,通过把函数委托传递给函数,就可以控制函数的执行。例如,一个函数要对字符串数组按照字母进行排序。对列表排序有几个不同的方法,它们的性能取决于要排序的列表特性。使用委托可以把一个排序算法函数委托传递给排序函数,指定要使用的函数。

委托有许多用途,但如前所述,它们的大多数常见用途主要与事件处理有关



目前还没有评论
添加一条新评论

登录后可以发表评论 去登录