理解不同的类型之间的区别,可以提高编码效率。


基元类型(primitive type)
编辑器直接支持的数据成为基元类型
int => System.Int32
sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、bool、decimal、string、object、dynamic
可以理解为方便我们编码,编辑器可以自动转换 System.XX 类型

编译器可以执行基元类型之间的隐式或显式转换

int i = 5;
long l = 5;
byte b = (byte)5; //可能丢失精度时需要显式转换

checked 和 unchecked 基元类型操作
可以检测算术运算的结果是否溢出


引用类型和值类型
CLR 支持的两种类型
使用引用类型必须要留意一些性能问题
a.内存必须从托管堆分配
b.堆上分配的每个对象都有一些额外成员,这些成员必须初始化
c.对象中的其他字节总是设为0
d.从托管堆分配对象时,可能强制执行一次垃圾回收

如果所有的类型都是引用类型,程序性能将显著下降
为了提升简单和常用类型的性能,CLR 提供了值类型的轻量级类型
值类型的实例一般在线程栈上分配(也可以作为引用类型的字段)
(创建一个线程会分配1MB的栈空间)
值类型的实例不包含指向实例的指针,包含了实例本身的字段。并且不受垃圾回收器的控制
值类型派生自 System.ValueType (派生自 System.Object)

值类型可以提供更好的性能,但是最好满足以下要求:
a.类型具有基元类型(都是简单类型)
b.类型不需要从其他任何类型继承
c.类型也不派生出其他任何类型
值类型实例大小也在考虑范围之内,实参默认以传值方式传递,造成对值类型实例中的字段进行复制,对性能造成损害。在作为返回值时,也会复制。那最好满足以下条件:
a.类型的实例较小(16字节或者更小,一个寄存器能存下)
b.类型的实例较大时,不作为方法实参或者返回值

值类型和引用型的一些区别
a.会发生装箱
b.需要自己重写 Equals 和 GetHashCode 方法,确保在字段值完全匹配的前提下返回 true
(System.ValueType 已经做了这处理,但也需要自己实现)
c.不能在值类型中引入任何新的虚方法,所有的方法都不能是抽象的
d.引用类型默认是null,如果访问对象会报出空异常。值类型总是包含基础类型的一个值,所有成员都初始化为 0,访问不会造成空异常
e.将值类型变量赋值给另一个会进行逐字段的复制。引用类型只复制内存地址,所以两个活多个引用类型可以引用堆中的同一个对象
f.未装箱的值类型不在堆上分配,一旦定义了该类型的一个实例方法不再活动,为他们分配的存储就会被释放

可以通过 StructLayoutAttribute 特性,告诉 CLR 按什么方式排列类型的字段
a.LayoutKind.Auto:自动排列字段
b.LayoutKind.Explicit:保持自己的字段布局
c.LayoutKind.Explicity:利用偏移量在内存中显示排列

如果不指定,编辑器会自动选择,一般引用类型是a,值类型是b


值类型的装箱和拆箱
比如使用 ArrayList.Add 就会发生装箱,具体做了什么呢?
a.在托管堆中分配内存(值类型各字段所需的内存+类型对象指针+同步块索引)
b.值类型的字段复制到新分配的堆内存
c.返回对象地址,值类型变成了引用类型

从 ArrayList 取数据时,就回发生拆箱,具体做了什么呢?
a.如果变量为 null,抛出空异常
b.如果不是空,但不是所需的值类型,抛出 InvalidCast 异常

CLR via C#-基元类型、引用类型和值类型相关推荐

  1. 跟小静读CLR via C#(02)-基元类型、引用类型、值类型

    跟小静读CLR via C#(02)-基元类型.引用类型.值类型 一. 基元类型 编译器能够直接支持的数据类型叫做基元类型.例如int, string等.基元类型和.NET框架类库FCL存在着直接的映 ...

  2. 第五章 基元类型、引用类型、值类型 CLR学习第五课

    一.基元类型:编译器直接支持的数据类型称为基元类型(如int类型其对于的是system.int32). 二.类型溢出,可以用checked 和unchecked进行类型溢出检查和不进行类型溢出检查.一 ...

  3. 《CLR via C#》读书笔记 之 基元类型、引用类型和值类型

    第五章 基元类型.引用类型和值类型 2013-02-27 5.3 值类型的装箱和拆箱     5.3.2 对象的相等性和同一性 参考 ToDo: 什么时候使用值类型,什么时候使用引用类型 5.3 值类 ...

  4. .net 基元类型,引用类型和值类型

    基元类型(primitive type): 编译器直接支持的数据类型称为基元类型(primitive type). string 与 String: 由于C#中的string (一个关键字)直接映射到 ...

  5. 第五章 基元类型,引用类型和值类型

    目录 5.1 编程语言的基元类型 5.2 引用类型和值类型 5.3 值类型的装箱和拆箱 5.4 对象哈希码 5.5 dynamic基元类型 5.1 编程语言的基元类型 编译器直接支持的数据类型称为基元 ...

  6. 读书笔记_CLR.via.c#第五章_基元类型_引用类型_值类型

    基元类型 1.不管在什么操作系统上c#的int始终代表32位整数. 2.c#中long代表64位. 类型转换 安全转换时,才允许隐式转型. 不安全转换时,为显式转型. 溢出检测方法 控制溢出的一个办法 ...

  7. 《.NET框架程序设计》第5章 基元类型、引用类型与值类型

    5.1 基元类型 基元类型可以用快捷语法.比如int a=0;等同于System.Int32 a=new System.Int32(); 建议,使用全名,为了代码含义看起来更清晰. 5.1.1 Che ...

  8. [转载]实际举例C#引用类型和值类型的区别

    http://www.cnblogs.com/coolbeibei/archive/2009/03/23/1419706.html 实际举例C#引用类型和值类型的区别 我们都知道,c#的两大数据类型分 ...

  9. 浅析.NET中的引用类型和值类型(上)

    .NET中的类型分为值类型和引用类型,他们在内存布局,分配,相等性,赋值,存储以及一些其他的特性上有很多不同,这些不同将会直接影响到我们应用程序的效率.本文视图对.NET 基础类型中的值类型和引用类型 ...

最新文章

  1. 枚举 ---- D. Zigzags[ Educational Codeforces Round 94 (Rated for Div. 2)]思维枚举优化4重循环
  2. Find Integer(费马大定理的使用)
  3. java初学编程题及答案_Java 入门编程题答案记录(记录)
  4. 约瑟夫问题(java实现)
  5. Google-优秀移动站点设计10招
  6. Python-Pandas之两个Dataframe的差异比较
  7. 奇偶链表的分割(C++)
  8. java输入奇数得菱形_输入行数,打印菱形
  9. 用Spring Boot实现一个高铁/铁路售票系统
  10. CEO如何做好企业战略管理?
  11. Win10系统如何在Word中添加新字体
  12. 博客备份工具(博主网)开发略谈
  13. GRUB4DOS(十二)适用于FAT32的分区引导扇区启动代码
  14. C语言 | 自由落地,求第10次落地共经过多少米
  15. 读书笔记-精准努力-励志本身就已经让你爽了以为自己真这样做了
  16. UGUI图集的理解与使用
  17. linux网络盘 nobody,nfs只能挂载为nobody的解决方法
  18. 10年,20年后,你会是什么样子?
  19. Python数据分析实战2.4-注释【python】
  20. VMware ESXI 6 开启VT-x硬件虚拟化技术

热门文章

  1. 微信公众号中增加地图位置标识
  2. DIV+CSS IE6/IE7/IE8/FF兼容问题大全
  3. Springboot人事信息管理系统毕业设计-附源码221507
  4. OpenGL入门教程(转)
  5. 图书推荐5:《企业应用架构模式》
  6. 例题8-13:环形跑道
  7. 水土不服的轻食,或注定是“一口风”
  8. 水泵状态监测与故障诊断
  9. C语言字符串处理的一些函数strok,strstr, strchr,strsub
  10. SCAU软件工程基础