做C#程序员一定要知道的语言特性

小小总结一下一些经常会用到的C# 4.0的语言特性,顺序很随意。

1. Interface
Interface并不是C#特有的东西,面向对象语言都有接口这个东西。但是在C#中,接口的地位其实是要比Abstract Class重要的。这尤其表现在单元测试使用Mock的时候。由于在C#语言中,只有显性标识virtual的方法才可以被Override,所以当我们需要在测试中进行动态Mock的时候,就需要我们被Mock的target是接口,而不是class,这样,方法才能被动态替换。
2. Automatic Property
这个东西应该算得上是令Java程序员最羡慕的东西了,和Java相比,省去了繁琐的getter和setter。其实在现在强大的IDE的帮助下,生成getter和setter并不是什么大问题,也是很方便的。但是,有了Automatic Property,代码中不再需要定义这些冗余的方法了,使得代码更简洁,更易读。
3. Linq
Linq这东西可以说是每个C#程序员必不可少的工具,通过使用Linq我们的代码更加简洁直观。同时,通过Linq的可拓展性,我们不但在访问Collection时才可以使用Linq,在处理XML,数据库,处理文本的时候同样可以使用,这统一了很多不同环境的API,使我们大大提高代码效率。
4. DataTable
DataTable提供了一个在内存中表示数据库表的方法,使用DataTable,我们可以很容易的对数据库进行轻量操作。当然,当数据量很大的时候,DataTable这种形式还是很有问题的,毕竟要把数据都读到内存里。个人认为DataTable最大的魅力其实是在数据显示和更新上,通过DataTable显示数据,我们不需要生成POCO,可以大大提高工作效率,同时,由于DataTable本身支持对Row状态的管理,我们可以很容易知道哪些数据被用户修改过,而只把这部分数据存储。DataTable还支持数据XML导出,我们可以很容易对数据进行序列化和反序列化。最后,DataTable通过Linq Extension可以支持全部的Linq功能,可以使我们在内存中对数据方便的进行各种操作。总结一下,在我们需要快速完成工作,生成Prototype的时候,DataTable绝对我们值得信赖的多面手。
5. Expression Tree
Linq背后的真正功臣。当我们在使用Linq的时候,无时无刻不在使用Expression Tree。直接使用Expression Tree则可以很容易的解决一些我们在静态语言中很难解决的问题。以后有时间我会向大家介绍一下最近在工作中遇到的一个例子。
6. Extension Method
这个东西很多人都说他是Magic,最初接触它的时候,我本人对Extension Method非常不感冒,原因很简单,那就是方法在类中找不到了,这让代码的可读性大大下降。但是,不得不说Extension Method可以省去了很多Utility类,同时,这种随用随加的方式,可以很好地提高代码的重用性。Extension method还有一个可以简化接口设计的妙用,以后给大家介绍。
7. Indexer
使用Indexer这个东西可以很好得对一些collection的复杂下标操作进行封装,在设计一些特殊的数据结构的时候,例如稀疏矩阵,会很好用,可以很好地统一接口和封装操作。
8. Dynamic
Dynamic变量在我们需要处理很复杂的接口继承,需要频繁Cast类的时候,对简化代码有奇效。但是,和所有动态语言一样,一旦使用了Dynamic变量,所有的静态检查也就失灵了,同时,Dynamic的背后也是Expression tree,当发生异常的时候,产生的Exception往往非常难懂,所以,使用dynamic的代码,都最好经过严格的单元测试。这里说明一下,很多人会把dynamic和DynamicObject搞成是一个东西,其实这两个东西真的是不同的,只是有一些关系而已。

标签