CSharpThinkingC# 要点(附加三)

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()

原文地址:https://www.cnblogs.com/cuiyansong/p/3054049.html