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