在.NET平台下使用C#交互式控制台(上):简介
上周日在广州的珠三角技术沙龙上,我的演讲题目是“Mono之于.NET程序员”。Mono一直是我十分喜爱的产品,我也一直关注它的发展,总有很多人用各种方式对它进行FUD,甚至是.NET程序员自己。这其实跟程序员使用盗版一样,自掘坟墓,是种无比愚蠢的行为。在演讲中,我提到.NET程序员可以如何从Mono项目中得到帮助,现在便以C#交互式控制台为例,演示下在.NET平台下使用Mono项目的常见方式。
Mono和.NET都是CLI(ECMA 335)的实现,包括C#语言编译器,运行时和类库等等。与微软实现的.NET不同,Mono是个开源项目,我们可以在授权允许的范围内任意折腾。例如,微软在Silverlight里提供了一个JSON类库,但我们无法将其用于普通的.NET项目,于是我们就可以从Mono里剥离相关代码出来。再比如,Windows Phone的SDK中没有提供像.NET 4.0里面一样的任务并行库,于是也有开发人员将Mono里面的实现移植了过来。社区成员也十分喜欢开源,因此无论是Mono团队还是其他开发人员都会很乐意捣鼓各种东西,并且也搞出许多有意思的东西来。C#交互式控制台(有时也将其称为REPL,即Read-Eval-Print-Loop)就是其中一个。
之前Anders Hejlsberg在PDC 2010中提到“C#与Visual Basic的未来”,其中一项功能就是“编译器即服务(Compiler as a Service)”。这个功能是指,把编译器的功能向普通用户开放出来,这样便可以实现更多的东西,例如代码解释执行,或是把代码变成语法树,让程序理解其语义等等(这便是Jscex的根本所在)。其实几年前就已经在Mono有类似的实现了。Mono的C#编译器mcs本身是由C#实现的,因此它直接就包含了编译器的完整功能,API好用与否暂且不论,但的确提供了这方面的能力,需要的同学完全可以自行获取。
Mono编译器功能暴露在Mono.CSharp类库中,而C#的交互式控制台便是“编译器即服务”顺理成章的衍生品。我想你一定遇到过这样的情况,例如,知道DateTime类型的ToString在接受某些参数会输出什么样的效果,却有些记不清,查文档自然会有答案但是太麻烦,其实一试便知。还有比如字符串解析,正则表达式匹配,临时计算等等。我见过很多同学在遇到这种情况的时候,都会直接把代码写在程序里,然后设置断点,然后运行程序观察执行效果。经验丰富一点的朋友则会时刻准备着一个控制台项目或是用Snippit Compiler,写点试验代码运行一下。不过,最理想的方式其实是使用F#,Scala,Ruby,Python等语言中都有的交互式控制台。例如以下便是在VS 2010中自带的F#交互式控制台:
我几乎天天都会用到F#交互式控制台,用来验证一些做法和猜想是否正确,确定之后再写成C#代码。我会F#,使用F#交互控制台自然不在话下。如果您懂得Python或Ruby,则使用IronPython或IronRuby的交互式控制台也是个不错的办法。但如果您只会用C#,那似乎就没辙了。幸运的是,Mono为C#程序员打开了这扇窗,我们也完全可以使用C#的交互式控制台来辅助工作,如下图:
在下一篇文章里,我们便来一起看一下,如何让Mono提供的C#交互式控制台运行在Windows和.NET下。这是个不错的例子,略有障碍,也没有过于复杂或取巧的地方,可以作为.NET程序员利用Mono组件的一个典型示例。
最后再附上上周日的演讲幻灯片,大伙后睹为快:
总之一句话:作为.NET程序员,如果您忽视或排斥Mono的话,损失的将会是你自己。