Part 1
一.值类型和引用类型的误区:
1.结构是轻量级的类。
错误,大多数时候结构交类中少了很多方法,略显轻便,但DateTime是返例,DateTime携带了计算方法。类中所带的方法是引用类型,并不会大量消耗内存。
2.引用类型在堆上,值类型在栈上。
错误,变量的值是在它声明的位置存储的,引用类型始终在堆上,值类型则可能在堆上也可能在栈上,具体取决于上下文。假定,一个类中有一个int类型的实例变量,在堆上(那么在这个类中的任何对象,总是在堆上)。
3.对象在C#中默认是通过引用传递的。
错误,涉及到一个引用类型时,可以以“引用”方式传递,也可用“传值”方式传递。引用类型作为方法参数时,参数默认是以“值传递”的方式来传递的,但值本身是一个引用。
二.装箱和拆箱
1.拆箱与装箱是Copy副本,改变原始值并不改变拆/装箱后的值。
2.如果一个类型的值调用ToString、Equals、GetHashCode时,没有覆盖这些方法,将会发生装箱(基类方法为Object)。将值作为接口传递时也是如此。
三.与委托有关
C#1:实例方法,签名必须相同。
C#2:方法组转换订阅事件。
C#3:Lambda表达式、隐式转换+匿名委托、扩展方法。
C#4:委托中支持泛型的协变和逆变,动态类型。
Part 2
一.泛型
1.为什么需要泛型:无需每次强制转换C#1,减少拆箱与装箱操作(提升性能),IDE中集成检查(编译时检查,而不是在运行时)。
2.List<T> 读作:List Of T ,仿VB。命名上Tkey ,TValue更有意义。
3.泛型方法和泛型类型。
4.类型约束:引用类型约束,值类型约束,构造函数类型约束,转换类型约束,组合约束。
5.遇到泛型类型时,编译器会在编译未绑定的泛型类型时就解析好所有方法重载,而不是等到执行时。
6.泛型迭代:IEnumerator<T>
7.反射:typeof()