C#/Net代码精简优化技巧(三)

发表于:2010-11-15 15:46

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:oec2003(水杯) 译    来源:51Testing软件测试网采编

  前面两篇中已经介绍了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>>();

  上面的代码的类型定义很明显,是什么类型就用什么类型来定义,下面尝试用var关键字来定义

// nicer!
var obj = new ActiveOrdersDataAccessObject();
// Ah, so much nicer!
var productsByCategory = new Dictionary<string,List<Product>>();

  用var关键字后代码变得简洁多了,编译器会在编译时去推断是什么类型,var关键字只相当于是一个占位符。

  而且使用var关键字在我们使用泛型或是Linq表达式时会提供更好的可读性,比较下面两行代码:

// 隐式类型
var results1 = from p in products where p.Value > 100 group p by p.Category;

// 显示类型
IEnumerable<IGrouping<string, Product>> results2 =
    from p in products where p.Value > 100 group p by p.Category;

  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)
{
    if (p.Value > 100)
    {
        List<Product> productsByGroup;
        if (!results.TryGetValue(p.Category, out productsByGroup))
        {
            productsByGroup = new List<Product>();
            results.Add(p.Category, productsByGroup);
        }

        productsByGroup.Add(p);
    }
}

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号