摘要:
建议27:在查询中使用Lambda表达式 LINQ实际上是基于扩展方法和Lambda表达式的。任何LINQ查询都能通过扩展方法的方式来代替。 等价于: 针对LINQ设计的扩展方法大多应用了泛型委托。System命名空间定义了泛型委托Action、Func和Predicate。Action用于执行一个 阅读全文
摘要:
建议26:使用匿名类型存储LINQ查询结果 从.NET3.0开始,C#开始支持一个新特性:匿名类型。匿名类型有var、赋值运算符和一个非空初始值(或以new开头的初始化项)组成。匿名类型有如下基本特性: 即支持简单类型也指出复杂类型。简单类型必须是一个非空初始值,复杂类型则是一个以new开头的初始化 阅读全文
摘要:
建议25:谨慎集合属性的可写操作 如果类型的属性中有集合属性,那么应该保证属性对象是由类型本身产生的。如果将属性设置为可写,则会增加抛出异常的几率。一般情况下,如果集合属性没有值,则它返回的Count等于0,而不是集合属性的值为null。下面的代码将产生一个NullReferenceExceptio 阅读全文
摘要:
建议23:避免将List<T>作为自定义集合类的基类 如果要实现一个自定义的集合类,不应该以一个FCL集合类为基类,反而应扩展相应的泛型接口。FCL结合类应该以组合的形式包含至自定义的集合类,需要扩展的泛型接口通常是IEnumerable<T>和ICollection<T>(或ICollection 阅读全文
摘要:
建议24:迭代器应该是只读的 如果注意观察会发现,FCL中的迭代器只有GetEnumerator方法,没有SetEnumerator方法,所有的集合类也没有一个可以写的迭代器属性。原因有二: 一:这违背了设计模式的开闭原则。被设置到集合中的迭代器可能会直接导致集合的行为发生异常或变动。一旦确实需要新 阅读全文
摘要:
建议22:确保集合的线程安全 集合线程安全是指多个线程上添加或删除元素时,线程键必须保持同步。 下面代码模拟了一个线程在迭代过程中,另一个线程对元素进行了删除。 以上代码运行过程会抛出InvalidOperationException:“集合已修改,可能无法执行枚举。” 早在泛型集合出现之前,非泛型 阅读全文
摘要:
建议21:选择正确的集合 要选择正确的集合,首先要了解一些数据结构的知识。所谓数据结构,就是相互之间存在一种或多种特定关系的数据元素的集合。 集合的分类参考下图: 由于非泛型集合存在效率低及非类型安全的缺点,所以这里只讨论泛型集合。 如果集合的数目固定并且不涉及转型,使用数组效率高,否则使用List 阅读全文
摘要:
建议20:使用泛型集合代替非泛型集合 在建议1中我们知道,如果要让代码高效运行,应该尽量避免装箱和拆箱,以及尽量减少转型。很遗憾,在微软提供给我们的第一代集合类型中没有做到这一点,下面我们看ArrayList这个类的使用情况: 上面这段代码充分演示了我们可以将程序写得多么糟糕。首先,ArrayLis 阅读全文
摘要:
建议19:使用更有效的对象和集合初始化 依赖于属性和FCL 3.5之后的语法规则,现在我们有了更加简洁有效的对象和集合初始化机制:对象和集合初始化设定项。 对象初始化: 对象初始化设定项支持在大括号中对自动实现的属性进行赋值。以往只能依靠构造方法传值进去,或者在对象构造完毕后对属性进行赋值。现在这些 阅读全文