[原] C# 3.0的委托(delegate)及Lambda表达式应用实例

C# 3.0新增了很多特性,其中委托(delegate)配合Lambda表达式使得程序简洁了很多。
我也就来尝尝鲜(其实也不算鲜了,C# 4.0都出来了。。。),说说我的应用实例:读取Micaps(一种气象上用的软件)数据文件。
Micaps有各类数据文件,比如第一类表示地面填图,格式是:
diamond 1 屏幕上需显示的内容
年 月 日 时次 总站点数
区站号 经度 纬度 ……(后面的你也不关心,就略掉了)

第二类表示高空填图,格式是:
diamond 2 屏幕上需显示的内容
年 月 日 时次 层次 总站点数
…… (参数与地面当然不一样)

如上,第一行是所有文件的通用信息,表示了该文件的类型、标题等,后面就是具体数据,每类文件格式不一。
于是,就要针对不同类型写不同的处理方法,但是,打开文件、关闭文件、检验第一行 这些又是一样的,导致代码重复。
这时候,委托就非常有意义:可以在父类里完成通用处理,而具体的数据处理通过委托交给子类具体负责。

如上,基类创建了LoadHandler这个委托类型,使得可以动态调用子类具体的操作。
如下是第一类数据格式的子类

其中的 (StreamReader reader) => {} 就是传说中的Lambda表达式,实际相当于:
delegate(StreamReader reader) {}
当然,C#3.0编译器够聪明,第14行甚至可以写成 return Load(path, reader => …
不过我觉得这样写以后看代码可能会晕,既然编译结果是一样的,何必省那么几个字呢。。。。
关于C#1.0 2.0 3.0的delegate演变可以看看这篇文章,总结得很好了:
http://huan-lin.blogspot.com/2009/01/delegate-revisited-csharp-1-to-2-to-3.html

发表评论