zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C#用Lambda和委托实现模板方法

c#模板方法 实现 lambda 委托
2023-06-13 09:14:47 时间

1问题描述
查看下面这段代码:

复制代码代码如下:


int[]a=[1,2,3];

for(inti=0;i<a.length;i++)
 {
   a[i]=a[i]*2;
 }

for(inti=0;i<a.length;i++)
 {
   Console.WriteLine(a[i]);
 }

很明显,上述代码中存在for循环的重复代码。

2解决方案
如何消除重复?使用委托。

•定义委托

复制代码代码如下:

delegateintmapfun(intx);//以替换上述代码中不同的部分

•模板方法

复制代码代码如下:
//只负责遍历
voidmap(mapfunfn,int[]a)
{
 for(inti=0;i<a.Length;++i)
   {
     a[i]=fn(a[i]);
   }
}

•客户端代码

复制代码代码如下:
int[]a={1,2,3};
map(delegate(intx){returnx*2;},a); //.Net2.0支持委托匿名方法
map(x=>{Console.WriteLine(x);returnx;},a);//.Net3.0开始支持lambda表达式

3完整代码示例

复制代码代码如下:
classProgram
{
 staticvoidMain(string[]args)
 {
   int[]a={1,2,3};
   map(delegate(intx){returnx*2;},a); //.Net2.0支持委托匿名方法
   map(x=>{Console.WriteLine(x);returnx;},a);//.Net3.0开始支持lambda表达式
 }

 delegateintmapfun(intx);
 staticvoidmap(mapfunfn,int[]a)
 {
   for(inti=0;i<a.Length;++i)
     {
       a[i]=fn(a[i]);
     }
 }
}

4与传统模板方法的比较
1.减少了子类数量,模板方法中,拓展一套算法就需要一个子类。
2.模板将算法隐藏,委托交由客户代码去选择。