1、一些开发人员说应用程序在32位操作系统上运行,int代表32位整数;在64位操作系统上运行,int代表64位整数。这个说法是完全错误的。C#的int始终映射到System.Int32,所以不管在什么操作系统上运行,代表的都是32位整数。

2、checked、unchecked来检查、不检查表达式是否产生溢出;C#默认关闭溢出检查;

UInt32 invalid=unchecked((UInt32)(-1));

-----------------------------------------------------------

Byte b=100;

b=checked((Byte)(b+200));//抛出OverflowException异常

3、System.Decimal是非常特殊的类型,CLR不将他视为基元类型;没有相应的IL指令来处理Decimal值,所以checked和unchecked操作符、语句以及编译器开关都失去了作用;

4、引用类型总是从托管堆分配,C#的new操作符返回对象内在地址——即指向对象数据的内存地址;

5、所有值类型都称为结构或枚举,所有结构都是抽象类型System.ValueType的直接派生类;System.ValueType本身又直接从System.Object派生;所有枚举都从System.Enum抽象类型派生,System.Enum从System.ValueType派生;

6、值类型转换成引用类型要使用装箱机制;反向转换,就是拆箱。但是拆箱,就是获取堆中各字段的地址,并不包含复制数值过程,但是往往紧接着会发生一次字段复制。

  装箱机制

  1.在托管堆中分配内存。分配的内存量是值类型各字段所需的内存量,还要加上托管堆所有对象都有的两个额外成员(类型对象指针和同步块索引)所需的内存量。

  2.值类型的字段复制到新分配的堆内存。

  3.返回对象地址。现在该地址是对象引用;值类型成了引用类型。

7、泛型集合在操作值类型的集合时不需要对集合中的项进行装箱/拆箱(因为一般的数组、非泛型集合如ArrayList类,是引用类型,增加值类型元素时要装箱)。单这一项改进,就使用性能提升了不少。这是因为托管堆中需要创建的对象减少了,进而减少了应用程序需要执行的垃圾回收的次数。

8、如果值类型要调用基类的方法(如非虚的、继承的方法),必须装箱,以便能够通过this指针将一个堆对象的引用传给基类;

9、拆箱后如果复制数据到线程栈中,并且修改栈的数据,原堆中的数据不受影响;

CLR via #C读书笔记三:基元类型、引用类型和值类型的更多相关文章

  1. [Clr via C#读书笔记]Cp5基元类型引用类型值类型

    Cp5基元类型引用类型值类型 基元类型 编译器直接支持的类型,基元类型直接映射到FCL中存在的类型. 作者希望使用FCL类型名称而避免使用关键字.他的理由是为了更加的清晰的知道自己写的类型是哪种.但是 ...

  2. CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段

    编程语言的基元类型   某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32();  // a = 0 a = 1 ...

  3. CLR via C#(02)-基元类型、引用类型、值类型

    http://www.cnblogs.com/qq0827/p/3281150.html 一. 基元类型 编译器能够直接支持的数据类型叫做基元类型.例如int, string等.基元类型和.NET框架 ...

  4. [CLR via C#]引用类型和值类型

    一.引用类型与值类型的区别 CLR支持两种类型:引用类型和值类型.引用类型总是从托管堆上分配的,C#的new操作符会返回对象的内存地址.使用引用类型时,必须注意到一些性能问题. 1)内存必须从托管堆上 ...

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

    编程语言的基元类型 编译器直接支持的数据类型称为基元类型.基元类型直接映射到Framework类库中存在的类型.例如:C#中的int直接映射到System.Int32类型.下表给出了C#基元类型与对应 ...

  6. 《CLR via C#》读书笔记(5)基元类型、引用类型和值类型

    5.1 基元类型 编译器直接支持的数据类型称为基元类型(primitive type). 以下4行到吗生成完全相同的IL int a = 0; //最方便的语法 System.Int32 b = 0; ...

  7. <NET CLR via c# 第4版>笔记 第5章 基元类型、引用类型和值类型

    5.1 编程语言的基元类型 c#不管在什么操作系统上运行,int始终映射到System.Int32; long始终映射到System.Int64 可以通过checked/unchecked操作符/语句 ...

  8. 【CLR Via C#】第5章 基元类型、引用类型、值类型

    第二遍看这本书,决定记录一下加深印象. 1,基元类型 什么事基元类型?基元类型是直接映射到FrameWork类库(FCL)中存在的类型,编译器直接支持的数据类型.比如int直接映射到System.In ...

  9. 【转载】MDX Step by Step 读书笔记(三) - Understanding Tuples (理解元组)

    1. 在 Analysis Service 分析服务中,Cube (多维数据集) 是以一个多维数据空间来呈现的.在Cube 中,每一个纬度的属性层次结构都形成了一个轴.沿着这个轴,在属性层次结构上的每 ...

随机推荐

  1. servlet的使用

    Servlet是比较基础的的客户端与服务器数据交互程序,通过HttpServletRequest请求和HttpServletResponse响应,可以基本实现web程序开发. 1.Servlet基础代 ...

  2. 类图(Rose) - Windows XP经典软件系列

    版权声明:本文为xiaobin原创文章.未经博主同意不得转载. https://blog.csdn.net/xiaobin_HLJ80/article/details/24584625         ...

  3. 牛客网多校训练第一场 D - Two Graphs

    链接: https://www.nowcoder.com/acm/contest/139/D 题意: 两个无向简单图都有n(1≤n≤8)个顶点,图G1有m1条边,图G2有m2条边,问G2有多少个子图与 ...

  4. Fidder学习基础(二)

    一. 巧用代理抓包. 首页,需设置Tools——>Fiddler Options——>Connectons,维护代理端口及允许其他设备连接. 这里,需要注意的是端口配置不能重复,抓包代理设 ...

  5. 关于iframe里的子页面如何调取父级页面里的事件(子调父)

    在子页面里面的事件里写 self.parent.window.父级函数名('参数名'); 父级里面直接写函数. js中的parent.top.self的含义. js中经常看到window.parent ...

  6. 【Linux学习笔记】Linux-CentOS下安装Redis

    虚机装了个Linux,尝试安装了一下Redis这款NoSQL数据库玩玩,作为Linux小白,我安装的是有可视化桌面的CentOS,所以不是纯命令行操作,怎么方便怎么来嘛~ 1.官网下载Redis到指定 ...

  7. OSD仿真_MFC程序01

    Windows系统具有强大的绘图功能,可以用来模拟OSD显示.接下来将设计一个简单的模拟显示终端的程序,用于后续显示功能和菜单系统的开发.说明一下,对于Windows下的MFC编程我不怎么了解,只知道 ...

  8. 并发之AtomicIntegerFieldUpdater

    基于反射的实用工具,可以对指定类的指定 volatile int 字段进行原子更新.此类用于原子数据结构,该结构中同一节点的几个字段都独立受原子更新控制. 先来看一段代码: package autom ...

  9. Python入门(案例)

    Python入门(案例) #一.上课案例: #输出hello wordprint('hello word') #python注释有两种#1.单行注释#这是单行注释#2.多行注释'''这是多行注释''' ...

  10. yii学习笔记(3),自定义全局工具函数

    在平时开发是经常需要打印数据来调试 常见的打印方式有print_r和var_dump,但是这样打印出来格式很乱不好浏览 在打印函数前后加上<pre></pre>就可以将内容原样 ...