前面两篇中已经介绍了10个小技巧,本篇是本次系列的最后一篇,将再介绍5个。这些小技巧看着并不起眼,有些您可能知道,但在平时的开发中可能由于惯性并没有去使用。所以建议大家掌握并去使用这些小技巧,他们将使我们的代码变得更简洁和易于维护。
1、隐式类型
首先了解一下概念,隐式类型并不是动态类型,隐式类型是用关键字var来定义,var定义的类型仍然是强类型。
很多人认为使用隐式类型是懒惰的表现,刚开始我也是这么认为的,但是想想我使用STL中迭代指针的开发经理,我就明白了。看下面代码:
for (list<int>::const_iterator it = myList.begin(); it != myList.end(); ++it) { // ... } |
很多时候我们会写出下面这样的代码
// pretty obvious ActiveOrdersDataAccessObject obj = new ActiveOrdersDataAccessObject(); // still obvious but even more typing Dictionary<string,List<Product>> productsByCategory = new Dictionary<string,List<Product>>(); |
// nicer! var obj = new ActiveOrdersDataAccessObject(); // Ah, so much nicer! var productsByCategory = new Dictionary<string,List<Product>>(); |
用var关键字后代码变得简洁多了,编译器会在编译时去推断是什么类型,var关键字只相当于是一个占位符。
而且使用var关键字在我们使用泛型或是Linq表达式时会提供更好的可读性,比较下面两行代码:
// 隐式类型 // 显示类型 |
2、Linq 扩展方法
在以前的编码中,很多时候我们需要去写一些自己的函数库,如排序、分组、查找或是其他的一些算法。并且我们要花很多的时间来为这些函数写单元测试,很多时候困扰我们的一些bug正是在这些方法中出现的。
随着Linq扩展方法的推出,你可以使用现成的这些标准的算法,而不需要自己再去写一遍,提供了极大的方便。需要排序可以使用OrderBy(),当需要查询条件时可以使用Where(),当需要选择一些类的属性时可以使用Select(),当需要分组查询时可以使用GroupBy(),这些Linq中的扩展方法经过了全面的测试,不需要我们来为他写单元测试代码,也不会出现让人困扰的bug。
看下面的例子,假设有一个集合List<Product>,集合里装载的是Product对象,Product有Value和Category两个属性,现在要按类别来查找Value值大于$100的数据,以前我们可能会像下面这样写
var results = new Dictionary<string, List<Product>>(); foreach (var p in products) productsByGroup.Add(p); |