C#中的委托和事件(三)

   1、  匿名方法

       到目前为止,要想使委托工作,方法必须已经存在(即委托是用方法的签名定义的)。但使用委托还有另外一种方式:即通过匿名方法。匿名方法是用作委托参数的一个代码块。

  用匿名方法定义委托的语法与前面的定义并没有什么区别。但在实例化委托时,就有区别了。下面是一个非常简单的控制台应用程序,说明了如何使用匿名方法:

namespace ConsoleApplication1

{

class Program

{

delegate string delegateTest(string val);

 static void Main(string[] args)

{

string mid = ",middle part,";

delegateTest anonDel = delegate(string param)

{

param += mid;

param += "and this was added to the string";

return param;

};

Console.WriteLine(anonDel("Start of string"));

}

}

}

     委托delegateTest定义为一个类级变量,它带一个字符串参数。有区别的是Main方法。在定义anonDel时,不是传送已知的方法名,而是使用一个简单的代码块:

{

param += mid;

param += "and this was added to the string.";

};

    可以看出,该代码块使用方法级的字符串变量mid,该变量是在匿名方法的外部定义的,并添加到要传送的参数中。接着代码返回该字符串值。在调用委托时,把一个字符串传送为参数,将返回的字符串输出到控制台上。

        匿名方法的优点是减少了系统开销。方法仅在由委托使用时才定义的。在位事件定义委托时,这是非常显然的。这有助于降低代码的复杂性,尤其是定义了好几个方法时,代码会显得比较简单。

      在使用匿名方法时,必须遵循两个规则。在匿名方法中不能使用跳转语句跳到该匿名方法的外部,反之亦然:匿名方法外部的跳转语句不能跳到该匿名方法的内部。

     在匿名方法内部不能访问不安全的代码。另外,也不能访问在匿名方法外部使用的ref和out参数。但可以使用在匿名方法外部定义的其他变量。

 

     2、 简单的委托示例

        在这个示例中,定义一个类MathsOperations,它有两个静态方法,对double类型的值执行两个操作,然后使用该委托调用这些方法。这个数学类如下所示:

class MathsOperations

{

public static double MultiplyByTwo(double value)

{

return value*2;

}

 

public static double Square(double value)

{

return value*value;

}

}

 

下面调用这些方法:

using System;

 

namespace SimpleDelegate

{

delegate double DoubleOp(double x);

class MainEntryPoint

{

static void Main()

{

DoubleOp[] operations ={

new DoubleOp(MathsOperations.MultiplyByTwo),

new DoubleOp(MathsOperations.Square)

};

for(int i=0; i<operations.Length;i++)

{

Console.WriteLine("Using operations[{0}]:",i);

ProcessAndDisplayNumber(operations[i],2.0);

ProcessAndDisplayNumber(operations[i],7.94);

ProcessAndDisplayNumber(operations[i],1.414);

Console.WriteLine();

}

}

 

static void ProcessAndDisplayNumber(DoubleOp action,double value)

{

double result = action(value);

Console.WriteLine("Value is {0},result of operation is{1}",value,result);

}

}

     在这段代码中,实例化了一个委托数组DoubleOp(记住,一旦定义了委托类,就可以实例化他的实例,就像处理一般的类那样——所以把一些委托的实例放在数组中是可以的)。该数组的每个元素都初始化为由mathsOperations类执行的不同操作。然后循环这个数组,把每个操作用用到3个不同的值上。这说明了使用委托的一种方式——把方法组合到一个数组中,这样就可以在循环中调用不同的方法了。

这段代码的关键一行是把委托传递给ProcessAndDisplayNumber()方法,例如:

                         ProcessAndDisplayNumber(operations[i],2.0);

其中传递了委托名,但不带任何参数,假定operations[i]是一个委托,其语法是:

1、operation[i]表示“这个委托”。换言之,就是委托代表的方法。

operations[i](2.0)表示“调用这个方法,参数放在括号中”。

ProcessAndDisplayNumber()方法定义为把一个委托作为其第一个参数:

     static void ProcessAndDisplayNumber(DoubleOp action,double value)

在这个方法中,调用: double result =action(value);

这实际上是调用action委托实例封装的方法,其返回结果存储在result中。

运行这个示例,得到如下所示的结果:

SimpleDelegate

Using operations[0]:

Value is 2, result of operation is 4

………………

………………

如果在这个例子中使用匿名方法,就可以删除第一个类MathOperations。Main方法应如下所示:

static void Main()

{

DoubleOp multByTwo = delegate(double val){return val*2;}

DoubleOP square = delegate(double val){return val*val;}

DoubleOp [] operations = {multByTwo,square};

for(int i=0;i<operations.Length;i++)

{

Console.WriteLine("Using operations[{0}]:",i);

ProcessAndDisplayNumber(operations[i],2.0);

ProcessAndDisplayNumber(operations[i[,7.94);

ProcessAndDisplayNumber(operations[i],1,414);

Console.WriteLine();

}

}

运行这个版本,结果与前面的例子相同,优点是删除了一个类。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值