Skip to main content
1.如何描述?
- 数据类型
- 对东西进行分类
- 实例
- 具体的东西
- 变量
- 指代某个东西
2.扩展数据类型
- enum
- 可以穷举的
- struct
- 结构化数据
- class
- 结构化数据+行为
3.类型转换
4.类成员初始化
- 调用顺序
- 静态成员 → 静态构造函数 → 实例成员 → 实例构造函数
- 无需初始化的成员
- 系统赋予默认值为0或null
- 需要初始化的成员
- 常量初始化直接在成员上赋值,带运算过程的再使用构造函数
- 复用构造函数
- 把多个构造函数重复的部分提炼出来,封装到私有构造函数中
5.判断相等:集合区分元素
- 引用相等
- ①static bool ReferenceEquals(object left, object right)
- 值相等
- ②static bool Equals(object left, object right)
- 值相等
- ③virtual bool Equals(object right)
- 值相等
- ④static bool operator ==(object left, object right)
- 值类型struct,应该重写③,④,以提高比较性能
- 需要用语义区分的引用类型class,应该重写③
- 重写③必须实现IEquatable,重载④能够提高程序可读性
6.比较大小:集合排序
- 类本身支持比较
- IComparable<T> 可以使用该逻辑同时重载运算符
- 专门负责对别人进行比较的类
- IComparer<T> 用于扩展排序规则
- 需要初始化的成员
- 常量初始化直接在成员上赋值,带运算过程的再使用构造函数
- 复用构造函数
- 把多个构造函数重复的部分提炼出来,封装到私有构造函数中
7.释放非托管资源
- IDisposable
- DotNet类库定义的释放资源接口
- 用到非托管资源的类
- 需要实现IDisposable接口
- 使用该类的上下文
- 需要在使用完成后调用该类的IDisposable接口
8.有原子性的值类型,让它保持常量性
- 原子性
- 最小的单元,再不能分割
- 常量性
- 状态不可变
- 编程建议
- 域为readonly,没有set属性,在get属性中的引用类型成员必须被复制,只能通过构造函数初始化
- 具有原子性的struct,不能单独修改属性,否则会把它割裂开,变成无意义的数据
- 所以在它诞生后,状态就一直不可变,成为常量
9.慎用ICloneable
- 原因
- 会绑架子类,使实现变得复杂
- 值类型
- 直接赋值更好
- 叶子类
- 可以使用
- 其它情况
- 尽量避免使用
10.尽量减少 装箱和拆箱
- 装箱
- 值类型 → Object类型
- 拆箱
- Object类型 → 值类型
- 避免原因
- 这两个操作非常耗费性能
1.如何描述?
- 函数类型
- 用delegate修饰,通过输入参数和输出参数来区分
- 变量
- 由函数类型声明,指代一类方法
- 实例
- 具体的函数,描述实现步骤
2.抒写建议
- 单一职责
- 结构清晰、逻辑简单,便于维护
- 重载
- 一个重载系列像一个梯形,短重载就是调用长重载,然后给后面的参数指定默认值
- 可选参数
- 在函数的声明中,直接给后面的参数赋默认值
- 重载和可选参数,在本质上都是对函数调用的复用
3.DotNet类库定义的委托类型
- Predict<>
- 返回 bool类型,自定义 in类型
- Action<>
- 返回 void类型,自定义 in类型
- Func<>
- 自定义 out类型,自定义 in类型
4.并行遍历集合
- 条件1
- 不关注遍历顺序
- 条件2
- 集合很庞大
- CPU密集时,使用PLinq
- 集合.AsParallel()【线程数量固定】
- I/O密集时,使用并行任务库
- Parallel.ForEach()【自动调整线程数量】
5.方法调用
- 传参
- 避免类型转换,按类型要求提供数据
- 结果
- 避免返回对成员的引用,防止被外界修改
6.设计Web API时选择合适的粒度
- 粒度小
- 通信次数多,数据传输量小(client陷入频繁等待)
- 粒度大
- 通信次数少,数据传输量大(一次等待的时间长)
- 选择合适的粒度
- 使client每次的等待时间都适中,在合理时间内完成一件事
7.何时隐藏基类方法:new
- 原因1
- 从第三方更新基类后,基类中新增的方法与派生类重名
- 原因2
- 重名方法已被大量使用,不方便在客户程序中修改
8.方法之间的契约
- 接口
- 调用类与被调用类 之间的约定
- 虚函数
- 父类与子类 的约定
- 回调
- 调用函数与被调用函数 之间的约定
- 事件
- 通知类与订阅类 之间的约定
1.程序集:隐藏不必要的类
- public
- 外部可见
- internal
- 程序集内可见
- private
- 类内部可见
2.类:隐藏不必要的方法成员
- public
- 外部可见
- protected
- 子类可见
- private
- 类内部可见
3.属性:隐藏不必要的数据成员
- 域必须是私有的,通过属性来暴露
- 属性的get和set中能够封装轻量级的逻辑
- 用户将属性看成数据成员,编译器将属性看成方法