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.模板将算法隐藏,委托交由客户代码去选择。
相关文章
- C# 读写 Photoshop PSD文件 操作类「建议收藏」
- c# mysql executenonquery_c#数据四种执行方法(ExecuteNonQuery)
- c# mysql executenonquery_C#与数据库访问技术总结(八)之ExecuteNonQuery方法
- C#用NHibernate实现CRUD详解编程语言
- C#/.NET BCL:基础类库
- c#数据库的sql参数封装类的编写
- C#多线程Singleton(单件)模式模板
- C#GetWindowRect简介及使用说明
- C#打印出正等腰三角形实例代码
- C#实现支持断点续传多线程下载客户端工具类
- C#Dynamic关键字之:解析dynamic就是Object
- 浅谈c#泛型类的应用
- C#BackgroundWorker组件学习入门介绍
- C#中timer类的用法总结
- C#连接mariadb(MYSQL分支)代码示例分享
- C#传值方式实现不同程序窗体间通信实例
- asp.netC#实现解压缩文件的方法
- C#反射应用实例
- C#自定义函数NetxtString生成随机字符串
- C#采用递归实现阶乘的方法
- C#实现Stream与byte[]之间的转换实例教程
- C#模板方法模式(TemplateMethodPattern)实例教程