编译器直接支持的数据类型称为基元类型。基元类型直接映射到Framework类库(FCL)中存在的类型,比如:int直接映射到System.Int32类型。再比如许多开发人员都困惑到底应该使用string还是String,其实作为基元类型的string也是映射到System.String的,所以两者是没有区别,都可以使用。
C#语言规范称:从风格上最好使用关键字,而不是完整的系统名称。但是许多大牛却更愿意使用FCL类型名称,并避免使用基元类型名称,这样可以避免映射的这个过程。
C#在做类型转化的时候,如果在安全的情况下,自行做隐式转型,在不安全的情况下,需要显示转化。所谓安全,是指不会发生数据丢失的情况,如:int32转int64.不安全意味着转换之后,有可能失去精度或数量级,如int32转int64.
CLR支持两种类型:引用类型和值类型。
值类型的装箱和拆箱。值类型是比引用类型更“轻型”的一种类型,因为他们不作为对象在托管中分配,也不会被垃圾回收,也不通过指针来引用。将值类型转换成引用类型需要装箱(boxing)。装箱会造成在托管堆上的内存分配,这会造成更频繁的垃圾回收,从而损害应用程序的性能。拆箱的代价比装箱低得多,其实就是获取一个指针的过程,该指针包含在一个对象中的原始值类型。
可以使用ILDasm.exe这样的一个工具来查看方法的IL代码,观察box这个IL指令会在哪里出现。
FCL心在包含一组新的泛型集合类,它们使非泛型的集合类称为“昨日黄花”,例如,应该使用System.Collections.Generic.List<T>类,而不要使用System.Collections.ArrayList类,这里泛型集合类的最大一个增强就是泛型集合类允许开发人员在操作值类型的集合时不需要对集合中的项进行装箱/拆箱处理。
C#是一种类型安全的编程语言。主要讲一下dynamic基元类型,基元类型object和dynamic都映射到FCL中的System.Object。任何表达式都能隐式转型为dynamic,因为所有表达式最终都会生成一个从Object派生的类型。编译器不允许将表达式从Object隐式转型为其他类型,必须使用显示转型。然而编译器却允许使用隐式转型语法将一个表达式从dynamic转型为其他类型。如:Objcet o=123;Int32 n1=o;就是错误的,必须Int32 n1=(Int32)o;显示转化才ok。而dynamic d1=123;Int32 n3=d1;就可以这样隐式转化。