代码改变世界

读FCL源码系列之List<T>---让你知其所以然---内含疑问求大神指点

2013-12-29 16:38 by stevey, 428 阅读, 0 推荐, 收藏, 编辑
摘要:序言 在.NET开发中,List是我们经常用到的类型。前段时间看到其他部门小伙伴讨论“两个List(10W个元素)集合求并集,list1.Where(p=>list2.Contains(p)).ToList()”,性能很差,有人说是ToList的问题,我当时第一直觉是关键在Contains方法,这个问题后面在来细说讨论。还有某大神说过,没反编译过框架源码的码农不是合格码农:)。下面我们就借助Reflector来读一读.NET4.0中List的源码,在读到一些方法实现时候,会更清楚,oh,原来是这样,解开以前的疑惑,写更有效率的代码。List的数据成员private const int _ 阅读全文

性能优化-列表类型转换(ConvertList<TSource, TResult>)

2013-12-16 16:55 by stevey, 1845 阅读, 3 推荐, 收藏, 编辑
摘要:之前,在项目中看到过一段通用列表类型转换的代码,直接的实现便是用反射。大概看了下,它用在领域模型转DTO和SOA接口中契约实体的转换等等。首先,它使用了反射,其次,还是在循环中使用,便有了优化的想法。方法原型如:public static List ConvertList(List source) where TResult : new(),下面贴出代码。说明一下,在此我没有任何的贬义,这段代码可能比较老,其次在项目中,首先是实现功能,如果当时没有更好的实现,就先实现功能,后面有时间可以在优化,毕竟项目有时间节点,个人自己平衡哈。public class ObjectConvertHelp.. 阅读全文

学习Visitor Pattern 有感而发!override and overload

2013-12-07 16:09 by stevey, 275 阅读, 0 推荐, 收藏, 编辑
摘要:通过阅读各位前辈写的博文,像吕震宇,idior,李建忠WebCast等,对Visitor模式有一定的了解,有感而记录下来,以备忘。 Visitor Pattern 假设了这样一个场景,在一个类型层次中,如果类型的个数稳定,且对类型操作不稳定(根据需求可能会变化)。在该模式中有个Double Dispatch的概念,即Element抽象一次,Visitor抽象一次多态。还有一次编译时多态(overload)。在Element中有Accept方法,留出以后可能扩展的操作,在ConcreteElement中,有如下关键点public override void Accept(Visitor v... 阅读全文

重看Decorator Pattern,联想到Delegate传递及Flags Enum--欢迎拍砖!

2013-11-30 21:53 by stevey, 308 阅读, 0 推荐, 收藏, 编辑
摘要:话说装饰模式(Decorator)的动机是“动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。[GOF《设计模式》]”。再次学到该模式,有感,联想到Delegate和Flags Enum。Delegate也可实现在已有功能上动态添加新功能,有点”装饰“的意图,Flags Enum可以进行组合使用。如果对装饰模式不熟悉,请移步大神博文http://terrylee.cnblogs.com/archive/2006/03/01/340592.html。本文描述该模式的相关思考,不正之处,请大神指点拍砖!谢谢 该模式的UML图: ,Decorato... 阅读全文

扩展LINQ to Entity:使用Lambda Expression批量删除数据------让微软帮我们生成T-SQL语句

2012-06-28 23:31 by stevey, 4728 阅读, 3 推荐, 收藏, 编辑
摘要:我们在使用EF(ADO.NET Entity Framework)的时候,大部分的的是查询操作,当然Insert,Update,Delete是没有问题的。但如果我们想要批量删除数据,那该怎么做呢?然后就尝试着去寻找一些方法,而后看到老赵的《扩展LINQ to SQL:使用Lambda Expression批量删除数据》,从中获益匪浅,学到不少东西,非常感谢。老赵的方法中需要解析Lambda Expression(当然也是正规的必经之路),来生成where条件及整个T-SQL语句,那么解析Expression需要考虑到很多方面,所以要实现一个比较完善的解析方法,目前来说比较复杂,要花费大量的.. 阅读全文

Expression Tree实践之通用《对象相等性比较器GenericEqualityComparer》------"让CLR帮我写代码"

2012-05-12 02:03 by stevey, 1464 阅读, 3 推荐, 收藏, 编辑
摘要:在上篇中,我们已经实现了一个根据类型动态生成Parse方法调用。下面我们就实现一个的对象“逻辑”相等的通用比较器,来继续领略一下Expression Tree的动态代码生成的强大功能。 实现这个通用比较器的想法是一个机遇巧合的。那天有个叫小玉的同事问到我这样一个问题,在list列表中怎么样过滤掉重复的对象?他好像是调用别人的存储过程接口,得到可能重复记录的list列表(先不管他这个场景是否合理)。我直接就把msdn关于distinct的方法法给他了,可他感觉好像比较复杂,最终好像是自己写了个for循环的方法实现需求了。刚好过了没多久,就读到老赵在InfoQ上的一篇文章《表达式即编译器》,... 阅读全文

Expression Tree实践之通用Parse方法------"让CLR帮我写代码"

2012-05-07 23:54 by stevey, 2311 阅读, 3 推荐, 收藏, 编辑
摘要:近来特别关注了Expression Tree 这个c#3.0以来的新特性之一。也尝试着寻找和使用它的最佳实践,通过阅读学习博客园内几位大牛写的相关文章,也算是入门了。它可以说功能强大,或许会让你意外的惊叹,比如:为什么之前有linq to everywhere的趋势,为什么可以linq to entity等。它使得我们可以动态的创建代码(匿名函数),而不是在编译时就硬编码这些代码。 下面就通过一个简单的需求,来一步一步分析重构,最终得到一个较好的实现吧。 题目:比如有这样一个字符串(“1,2,3,4,5”或者"1.1#2.2#3.3#4.0#5.1"),需要将它按照分隔符转 阅读全文

由“使用存储过程”引发的一些思考(高手请进)

2012-02-22 23:53 by stevey, 2310 阅读, 2 推荐, 收藏, 编辑
摘要:在以前ado.net时候,我们使用存储过程返回一个列表,可以将结果集放在DataTable中,如果我们需要将结果集放在一个强类型集合(如List<T>)中我们该怎么做呢?之前在网上看到过一种解决方法,忘记出处了,请谅解。大概思路是:在用DataReader读取一行记录时,将该行创建为一个对象,然后添加到列表中。 我在EF3.5中使用存储过程,需要在edmx(领域模型中)文件中做函数导入(Function Import),并且返回值类型必须是数据库中已存在的实体。这样做的缺憾(不够灵活)如下: 1、必须要函数导入,如果后来修改或更新实体模型,要维护该函数。(可以接受) 2、存储过程返 阅读全文

读《.NET设计规范》之命名规范的总结

2012-02-09 22:07 by stevey, 2090 阅读, 5 推荐, 收藏, 编辑
摘要:《.NET 设计规范》是数千名微软精锐开发人员的经验和智慧,最终浓缩在这本设计规范之中。它指导着.NET Framework几个版本的开发,和微软windows操作系统的下一代API---WinFX开发。上面这些话是C#之父说的,不是我。它指导着微软内部开发规范,可见是一本非常好的书,而且博客园的其他大牛也推荐过的,是一本修炼内功的武功秘籍。为什么需要命名规范?1、提高框架的可用性,一致性。使的不同项目的开发人员使用同一个框架成为可能。大到一个Framework,小到一些控件(Grid)或者封装的库,他们中的API都是为其他开发者所使用的,固良好的命名很重要。就比如:.NET Framew.. 阅读全文

【分享】(性能优化)思考数据列表中“特殊的列”

2012-01-06 01:05 by stevey, 217 阅读, 0 推荐, 收藏, 编辑
摘要:数据列表在应用程序中十分常见和普遍,尤其是管理类的软件操作界面,如:一个待办列表,邮件列表,用户列表等。数据列表的数据源是由我们通过数据查询,逻辑运算,最终展示为列表。 我们来看一种需求场景,假设列表中有一个“特殊的列“,它的数据不直接对应为数据库的列,或者是视图中的列,而是需要通过查询另外的关联表,通过计算得出,那么在绑定数据的时候,如何绑定上去呢?假如:有一张表单表(tab_FormData),列如下: Id,FormId(表单Id),Title(标题),Content(内容)。。。和一张任务表(tab_TaskInfo),列如下: Id,FormId(外键与ta... 阅读全文