委托 -- C#入门经典(第3版)

委托是一种可以把引用存储为函数的类型。这听起来相当棘手,但其机制是非常简单的。委托最重要的用途在本书介绍到事件和事件处理时才能解释清楚,但这里也将介绍有关委托的许多内容。在本书的后面使用它们时,这些内容有助于理解一些比较复杂的问题。

委托的声明非常类似于函数,但不带函数体,且要使用delegate关键字。委托的声明指定了一个函数签名,其中包含一个返回类型和参数列表。在定义了委托后,就可以声明该委托类型的变量。接着把这个变量初始化为与委托有相同签名的函数引用。之后,就可以使用委托变量调用这个函数,就像该变量是一个函数一样。

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

下面的示例使用委托访问两个函数中的一个。

试试看:使用委托来调用函数

(1) 在目录C:/BegVCSharp/Chapter6下创建一个新控制台应用程序Ch06Ex05。

(2) 把下述代码添加到Program.cs中:

class Program

{

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)

{

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 = new processDelegate(Multiply);

else

process = new processDelegate(Divide);

Console.WriteLine("Result: {0}", process(param1, param2));

Console.ReadKey();

}

}

(3) 执行代码,结果如图6-10所示。

图 6-10

示例的说明

这段代码定义了一个委托ProcessDelgate,其签名与两个函数Multiply()和Divide()的签名相匹配。委托的定义如下所示:

delegate double ProcessDelegate(double param1, double param2);

delegate关键字指定该定义是用于委托的,而不是用于函数的(该定义所在的位置与函数定义相同)。接着,用一个签名指定double返回类型和两个double参数。实际使用的名称可以是任意的,所以可以给委托类型和参数指定任意名称。这里委托名是ProcessDelgate,double参数名是param1 和 param2。

Main()中的代码首先使用新的委托类型声明一个变量:

static void Main(string[] args)

{

ProcessDelegate process;

接着用一些比较标准的C#代码请求由逗号分开的两个数字,并把这些数字放在两个double变量中:

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));

注意:

为了说明问题,这里没有包含用户输入的有效性验证。如果这些是“现实中的”代码,就应花更多的时间来确保在局部变量param1 和 param2中得到有效的值。

接着,询问用户是要相乘,还是相除这两个数字:

Console.WriteLine("Enter M to multiply or D to divide:");

input = Console.ReadLine();

根据用户的选择,初始化process委托变量:

if (input == "M")

process = new processDelegate(Multiply);

else

process = new processDelegate(Divide);

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

最后,使用该委托调用所选的函数。无论委托引用的是什么函数,该语法都是有效的:

Console.WriteLine("Result: {0}", process(param1, param2));

Console.ReadKey();

}

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

static void executeFunction(ProcessDelegate process)

{

process(2.2, 3.3);

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值