Hone C#

最近在恶补微软的“新”技术知识,而优雅(elegant)是一个以前在MS技术文档里没怎么见过而最近却老被人使用的形容词。随着对.Net Frameworks 技术构架的发展及C#语言本身进化(VB应该是与C#一致的,由于我不使用所以不提)的逐渐了解, 这个有些禅意的词汇在我脑袋里时隐时现,忽而觉得难解其所谓,忽而又觉得似乎找不到更好的词来形容C#的优美曲线。

也许是由于落课太多导致暂时无法充分理解优雅之美,但是我相信无论何种技术其本源的目的都是为了解决现实需求或是优化解决的方式。由现实的需求引发对方式的思考,进而抽象化出某种技术以期解决此类需求。技术以这种顺序诞生和发展,却往往被以相反的顺序去传授。

其实大可不必为优雅不优雅烦恼,我认为90%的需求可以使用10%最常用的技术来解决,尽管看起来有点所谓的ugly。也完全没必要为了所谓的血统和性能来评价技术的优劣,例如对LINQ的讨论。对任何方向倾斜的技术都是根据现实场景需求演化而生的,也许只是一种尝试,也许只是昙花一现,但是它代表了一种倾向,满足了一些场景,也注定会留下一份财富。说不定有一天就会像Ajax一样死灰复燃。

回到对优雅的思考,C#变得越来越优雅(或者说可以用C#写出越来越优雅的程序),其实是一系列进化体现的。有些是本质的如扩展方法,范型,有些是虚拟的如匿名方法,有些是衍生的如Linq。找出这些技术的产生场景,理清他们之间的关系,把msdn带有错字(部分)的晦涩的(绝大部分)资料消化成我能理解的概念,也许是我能尽快优雅起来的一条出路。而LINQ显然(至少在我看来)是串接这些技术的最好的实例。

Anonymous Methods & Lambda Expression
--------------------------------------------------
一切从委托说起,首先delegate(委托)我不认为这么翻译恰当,甚至认为就不该翻译,就像不需要翻译if为如果一样。delegate应该是“代表”的意思,他可以代表所有具有相同参数结构和返回类型的方法,其在框架设计上具有重大的意义,具体的就不多说了。delegate是不干实事儿的(中国人都知道,美国人怎么知道的呢?),所以具体的工作需要指定一个具体函数来实现。传统上我们通过该函数的签名(signature)来标记这种联系。

Code

实际应用中,由框架设计产生的delegate往往在一个相当广的应用域内实现逻辑是统一的。也就是没必要实现多种,而这种跳来跳去的指定严重降低了代码的可读性和逻辑完整性。C#2.0后,引入了Anonymous Methods(匿名方法)的概念,让我们可以方便的在delegate的调用处直接实现具体逻辑,更猛的是你可以在实现的代码块中使用局部变量(这是个双刃剑需小心使用请参考P.Adityanand[小刀人译] 老赵)。

Code

Lambda Expressions 可以使匿名方法的书写变的更简明。所有的匿名方法(delegate implement)都可以用Lambda Expression的形式来书写。但匿名方法可以省略delegate指定的参数列表,这是Lambda Expressions 所不能做到的。Lambda Expressions 有两种形式:Expression Lambda Expressions(为了行文方便简称ELE) 和 Statement Lambda Expressions(同样简称SLE) ,ELE可以理解做:表达式形式的Lambda 表达式,即=>(goes to)右侧为表达式。SLE则为陈述形式的Lambda表达式,即=>右侧为{}包裹的语句块(在右侧只有一条语句时可以省略{})。=>左侧为()包裹的参数列表(只有一个参数时可以省略())。SLE可以认为就是为了在行内(in-line)实现delegate的(匿名方法的功能),ELE在部分场景下也能做上述工作,但是其最主要的意义在于ELE是Linq的灵魂,通过ELE构造的Expression Tree为Linq to anything 提供了可能。

Code

posted on 2009-03-26 10:15  超子  阅读(282)  评论(0编辑  收藏  举报

导航