摘要:
建议29:区别LINQ查询中的IEnumerable和IQueryableLINQ查询一共提供了两类扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了IEnumerable接口的集合进行扩展;Queryable类,它针对继承了IQueryable接口的集... 阅读全文
摘要:
建议28:理解延迟求值和主动求值之间的区别要理解延迟求值(lazy evaluation)和主动求值(eager evaluation),先看个例子: List list = new List() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; ... 阅读全文
摘要:
建议27:在查询中使用Lambda表达式LINQ实际上是基于扩展方法和Lambda表达式的。任何LINQ查询都能通过扩展方法的方式来代替。var personWithCompanyList = from person in personList ... 阅读全文
摘要:
建议26:使用匿名类型存储LINQ查询结果从.NET3.0开始,C#开始支持一个新特性:匿名类型。匿名类型有var、赋值运算符和一个非空初始值(或以new开头的初始化项)组成。匿名类型有如下基本特性:即支持简单类型也指出复杂类型。简单类型必须是一个非空初始值,复杂类型则是一个以new开头的初始化项。... 阅读全文
摘要:
建议25:谨慎集合属性的可写操作如果类型的属性中有集合属性,那么应该保证属性对象是由类型本身产生的。如果将属性设置为可写,则会增加抛出异常的几率。一般情况下,如果集合属性没有值,则它返回的Count等于0,而不是集合属性的值为null。下面的代码将产生一个NullReferenceException... 阅读全文
摘要:
建议24:迭代器应该是只读的如果注意观察会发现,FCL中的迭代器只有GetEnumerator方法,没有SetEnumerator方法,所有的集合类也没有一个可以写的迭代器属性。原因有二:一:这违背了设计模式的开闭原则。被设置到集合中的迭代器可能会直接导致集合的行为发生异常或变动。一旦确实需要新的迭... 阅读全文
摘要:
建议23:避免将List作为自定义集合类的基类如果要实现一个自定义的集合类,不应该以一个FCL集合类为基类,反而应扩展相应的泛型接口。FCL结合类应该以组合的形式包含至自定义的集合类,需要扩展的泛型接口通常是IEnumerable和ICollection(或ICollection的子接口,如ILis... 阅读全文
摘要:
建议22:确保集合的线程安全集合线程安全是指多个线程上添加或删除元素时,线程键必须保持同步。下面代码模拟了一个线程在迭代过程中,另一个线程对元素进行了删除。 class Program { static List list = new List() {... 阅读全文
摘要:
建议21:选择正确的集合要选择正确的集合,首先要了解一些数据结构的知识。所谓数据结构,就是相互之间存在一种或多种特定关系的数据元素的集合。集合的分类参考下图:由于非泛型集合存在效率低及非类型安全的缺点,所以这里只讨论泛型集合。如果集合的数目固定并且不涉及转型,使用数组效率高,否则使用List。顺序存... 阅读全文
摘要:
Flyweight 享元模式(结构型模式)面向对象的代价面向对象很好的解决了系统抽象性的问题,同时在大多数情况下也不会损及系统的性能。但是,在某些特殊应用中,由于对象的数量太大,采用面向对象会给系统带来难以承受的内存开销。比如图形应用中的图元等对象、字处理应用中的字符对象等。动机(Motivatio... 阅读全文