05.基元类型、引用类型和值类型
基元类型:编译器直接支持的类型称为基元类型,直接映射到Framework类库中存在的类型
不安全转换表示数值丢失精度和数量级
文本常量看成类型本身的一个实例
checked和unchecked基元类型操作,用于规定是否检查溢出 ,可以用于一个表达式,也可以用于多条语句
CLR有一个add指令,将两个数相加不会检查溢出,还有一个add.vof会检查溢出
值类型的实例一般在线程栈中分配,在代表值类型实例的变量中,并不包含一个指向实例的指针,变量包含了实例本身的字段
所有的值类型都是System.ValueType的直接派生类,System.ValueType又是System.Object的派生类,所有的枚举都有System.Enum派生,System.Enum又是从System.ValueType派生
如果使用new操作符,C#会默认对实例进行了初始化,初始化为默认值
1.值类型对象有两种表示形式:未装箱和已装箱,引用类型总是处于已装箱的形式
2.不能将值类型作为其它类型的基类,所以值类型中不能有抽象的方法和虚方法
3.引用类型的变量包含一个在堆上一个对象的地址,值类型变量包含基础类型的一个值
4.值类型的复制会执行一次逐字段的复制,引用类型的复制只会复制地址
值类型的装箱和拆箱
值类型进行装箱操作
1.在堆上分配好内存
2.将值类型的字段复制到新分配堆内存
3.返回对象的地址
对象的相等性和同一性
从System.Object中提供了一个名为Equals的虚方法,它的作用是在两个对象包含相同的值的前提下返回true,相对于Object中的Equals方法实现的是同一性,而不是值的相等性
对象哈希码
System.Object提供一个虚方法GetHashCode,用于获取对象的Int32哈希码
一个类型定义了Equals方法后,一定要定义GetHashCode,因为在System.Collections.Hashtable类型、System.Collection.Generic.Dictionary类型以及其它一些集合类型中,要求两个对象相等,必须具有相同的哈希码
dynamic基元类型
可以用dynamic 表达式/变量调用一个成员,比如字段、属性/索引器、方法、委托以及一元/二元/转换操作符
使用dynamic声明动态类型,在编译时不支持智能感应,只有到运行时才能确定变量的类型