读C#代码整洁之道笔记03_切面关注点、异常处理和线程与并发

 

1. 核心关注点

1.1. 开发软件的原因

2. 切面关注点

2.1. 所有的代码领域都需要处理相关的问题

3. 结构化模式

3.1. 装饰器模式

3.1.1. 可以在现有对象上添加新的功能,而不改变其结构

3.2. 代理模式

3.2.1. 所提供的对象可以替代客户端使用的实际服务对象

4. 使用PostSharp实现AOP

4.1. 收费软件

4.2. 缓存

4.3. 日志

4.4. 异常

4.5. 安全

4.6. 验证

4.7. 事务

4.8. 资源池

4.9. 配置

4.10. 检测

4.11. 推荐使用Castle

5. 异常处理

5.1. unchecked模式

5.1.1. 改善性能

5.1.2. 很多情况下unchecked模式并不会发生运行时异常

5.2. NullReferenceException

5.2.1. 防御性编程

5.2.1.1. try {...} catch

5.2.2. 推荐实现ArgumentNullValidator

5.2.2.1. 推荐使用nameof(person)而不是对参数名称进行硬编码

5.3. 业务规则异常

5.3.1. Business Rule Exception,BRE

5.3.2. 符合预期的,并可用于控制程序的流程

5.3.3. 使用正常程序流程进行条件处理

5.3.4. 业务规则异常进行条件处理

5.3.5. 使用现有逻辑控制程序流程相比依赖抛出异常的方式显得更加合理

5.4. 异常应当提供有意义的信息

5.5. 自定义异常

5.5.1. 提供更详细的信息

5.5.2. 使用对最终用户更加友好的术语

5.6. 异常类的名称以Exception结尾

5.7. 由于异常导致方法无法完成时,应还原状态

6. 线程与并发

6.1. 使用线程池

6.1.1. 令线程池决定线程的数目而非手动设置相应值

6.1.2. 任务并行库(Task Parallel Library,TPL)

6.1.3. 使用ThreadPool.QueueUserWorkItem()

6.1.4. 使用异步委托

6.1.5. 使用BackgroundWorker

6.1.6. 令线程池决定线程的数目而非手动设置相应值

6.1.6.1. 限制线程池使用的处理器数目及线程数目

6.2. 使用互斥量同步线程

6.3. 使用信号量处理并行线程

6.4. 避免死锁

6.4.1. 当两个或者多个线程执行并等待对方完成时就会发生死锁

6.5. 避免竞态条件

6.5.1. 若多个线程使用同一个资源,并由于各个线程的时序不同而产生不同的输出,这种情况就称为竞态条件

6.6. 静态构造器

6.7. 静态方法

6.8. 可变性是多线程应用程序的问题之源

6.8.1. 创建后无法修改的对象称为不可变对象

6.8.2. 为了确保线程安全,请不要使用可变对象,按引用传递参数或者修改成员变量

6.8.3. ImmutableArray

6.8.4. readonly struct

6.9. 线程安全

6.9.1. 传递不可变类型,而非访问静态成员变量

6.9.2. 在使用集合,通过引用传递参数以及访问静态类的成员变量时必须非常小心

6.9.3. 非线程安全的代码,则需要用锁或者互斥量以及信号量锁定代码

6.9.4. 在System.Collections.Immutable命名空间中的集合是不可变集合。

6.9.5. 保护资源访问的另一种机制是使用信号量

6.10. 同步方法

6.10.1. 锁lock

6.10.2. 在项目中引入System.Runtime.CompilerServices命名空间,并在需要同步的方法和属性上标注[MethodImpl(MethodImplOptions.Synchronized)]特性

6.10.3. Interlocked类中的方法不会抛出异常

6.10.3.1. 无须使用lock语句以改善性能

6.11. 不要使用Thread.Abort中止其他线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值