《CLR via C#》设计类型.基元类型、引用类型和值类型

5.基元类型、引用类型和值类型

5.1基元类型

编译器直接支持的数据类型就是基元类型,基元类型直接映射到Framework类库(FCL)中存在的类型,例如:C#的int直接映射到System.Int32类型。可以理解为C#编译器自动添加了using指令:using int = System.Int32;

这就存在一个问题,开发人员会纠结用string还是String,由于string直接映射到System.String(一个FCL类型),所以两者没有区别,都能用。

编译器能执行基元类型之间的隐式或显示转换。隐式就是安全的,不丢失数据,比如从Int32转换为Int64;显示就是不安全的,可能会丢失数据。

字面值被视为类型本身的实例,故可以调用实例方法:123.ToString()

尽量使用有符号数值类型(比如Int32和Int64),不要使用无符号数值类型(比如UInt32和UInt64),原因:1.这允许编译器检测更多的上溢/下溢错误;2.由于Array和String的Length属性返回的是有符号的值,所以用有符号数值类型的话,就不需要强制类型转换;3.无符号数值类型不符合CLS(通用语言规范)。

5.2引用类型和值类型

引用类型:所有称为“类”的类型,比如:System.Exception类;值类型:结构或枚举,比如:System.Int32结构(int类型就是用struct实现的,所以int对象就是值类型)、System.IO.FileAttributes枚举。所有值类型都从System.ValueType派生,System.ValueType本身又直接从System.Object派生。记住:class定义的类就是引用类型,struct定义的类就是值类型。

引用类型和值类型的区别:

  1. 引用类型总是从托管堆分配,它内存的释放需要GC管理;值类型一般从线程栈分配,有自身的生命周期,不用GC管理。值类型的使用缓解了托管堆的压力,并减少了GC次数。
  2. 值类型有两种形式:未装箱(值类型)和已装箱(引用类型),引用类型是已装箱形式。
  3. 值类型(比如struct)中的所有方法都不能是虚方法,因为值类型不能作为基类型。
  4. 引用类型默认初始值为null,值类型默认初始值为0。
  5. 值类型赋值是逐字段的复制,引用类型赋值是复制内存地址。

复制引用的话,一改则全改;复制值的话,一改则一改。

5.3值类型的装箱和拆箱

装箱:将值类型转换成引用类型,C#编译器自动生成对值类型进行装箱所需的IL代码。装箱时发生的事:

  1. 在托管堆中分配内存;
  2. 复制值类型的字段到新分配的堆内存;
  3. 返回对象地址(也叫对象引用)。

拆箱:获取已装箱对象中的字段的地址。复制:将这些字段包含的值从堆复制到栈。拆箱就是获取指针的过程,不包括复制这一步,拆箱的代价比装箱低得多。举例:Point p = new Point(10, 10); Object c = p; p = (Point) c;Point是一个struct,p是未装箱的值类型,c是由p装箱后的引用类型,p = (Point) c;:先拆箱再复制。
对对象进行拆箱时,只能转型为最初未装箱时的值类型,比如装箱前是Int32类型,拆箱后就是Int32类型,不能是其他类型。

装箱拆箱的例子:
在这里插入图片描述
上述代码进行了三次装箱和一次拆箱。第一次装箱时第三行,第二次和第三次装箱都是最后一行:由于String是引用类型,最后一行的v需要装箱成引用类型;(Int32)o先拆箱成值类型,再由于String是引用类型而装箱成引用类型。书上有上述代码的IL代码P114。
上述代码最后一行的v可以写成v.ToString(),它返回一个String对象,这样可以避免装箱。

另外,未装箱的值类型 转型为 该类型的某个接口 是需要装箱的。

5.4对象相等性和同一性、对象哈希码

https://blog.csdn.net/BillCYJ/article/details/90519496

5.5dynamic基元类型

忽略dynamic,基本没意义。dynamic表示“变量的类型是在运行时决定的”,无需初始化。dynamic可用于局部变量、字段和参数。dynamic类型被编译后,实际是一个 object类型,并没有跳过类型校验,只是延迟到了运行时,如果在运行时,检测到类型不兼容,照样会抛出异常。用处:1.反射时简化代码,但会产生性能的缺失;2.便于和其他组件通信。

var和dynamic不同,var表示“变量的类型是在编译时决定的”,必须显式初始化。var只能用于局部变量的定义,编译器会根据表达式来推断出var变量的类型。

猜你喜欢

转载自blog.csdn.net/BillCYJ/article/details/90523870