1.如何描述?

数据类型
对东西进行分类
实例
具体的东西
变量
指代某个东西

2.扩展数据类型

enum
可以穷举的
struct
结构化数据
class
结构化数据+行为

3.类型转换

引用类型
as
值类型
强转
类型判断
is

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中能够封装轻量级的逻辑
用户将属性看成数据成员,编译器将属性看成方法

1.
2.