- 调用匿名方法
方法,也就是一小段可以重用的处理过程,一般我们都会把它独立编写出来,但如果这个逻辑本身非常简单,而且其变化范围仅仅是一个非常小的局部,或者需要使用闭包(需要把抽象的处理作为一个参数传递给其他逻辑调用),那么使用匿名方法是个不错的选择。此外,匿名方法结合反射会大大提升公共库的灵活性。
- C#用委托比用接口好,用委托比用线程池好
如果将异步调用任务交给统一的线程池机制来维护,则需要增加额外开发量,不如直接使用.net framework包装好的如TimerCallback之类的Delegate。 Interface可以使用的抽象方法描述是固定的,而使用Delegate,在运行过程中,可以根据动态要求自动适配目标方法。
- C#提供的抽象能力
- Class:提供了对现实世界的抽象
- Interface:提供了对Class行为的抽象
- Delegate:对方法的抽象
- Attribute:对类型元数据的抽象
- 泛型工厂方法
public static class RawGenericFactory{ public static T Create<T>(string typeName) { return (T)Activator.CreateInstance(Type.GetType(typeName)); } }
public class RawGenericFactory<T> { public T Create(string typeName) { return (T)Activator.CreateInstance(Type.GetType(typeName)); } }
- 泛型的作用
- 使用强类型避免装箱,提升性能
- 泛型约束,使接口和参数更明确
- 当类成员使用相同类型参数的同时,该类型参数的约束也同样适用于相关成员。
- 参数约束不适用于Attribute
- 使用泛型的建议
- 设计每一个模式角色类的时候,要根据客户程序的需要,反复斟酌类型参数约束
- 除了容器类以外,尽可能不要在生产代码里出现无约束的类型参数(”裸约束类型”)
- 索引器使用指导
- LINQ时代的索引器:乍一看,索引器似乎已经越来越接近于LINQ通过Lamada表达式完成的功能,不过有一些区别。
- 定位上索引器一般面向单条索引结果,而不是批量结果(尽管我们可以让索引器返回一个IEnumerable)。
- 从封装和客户程序使用的角度看,LINQ有各种内置并被优化的LINQto系列,而所引起给客户程序的是一种更贴近业务语义、更加直观的形式,因为客户程序无须编写LINQ查询,按照键值索引即可。
- 不过,把两者结合使用倒是一个非常不错的组合,索引器做接口,LINQ完成内部检索逻辑,客户程序在无须记住具体方法名称的前提下,按照键值检索即可,索引器内部则依托LINQto系列的基础,提供对各种异构数据源的访问