CLR via #C读书笔记三:基元类型、引用类型和值类型
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读书笔记三:基元类型、引用类型和值类型的更多相关文章
- [Clr via C#读书笔记]Cp5基元类型引用类型值类型
Cp5基元类型引用类型值类型 基元类型 编译器直接支持的类型,基元类型直接映射到FCL中存在的类型. 作者希望使用FCL类型名称而避免使用关键字.他的理由是为了更加的清晰的知道自己写的类型是哪种.但是 ...
- CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段
编程语言的基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32(); // a = 0 a = 1 ...
- CLR via C#(02)-基元类型、引用类型、值类型
http://www.cnblogs.com/qq0827/p/3281150.html 一. 基元类型 编译器能够直接支持的数据类型叫做基元类型.例如int, string等.基元类型和.NET框架 ...
- [CLR via C#]引用类型和值类型
一.引用类型与值类型的区别 CLR支持两种类型:引用类型和值类型.引用类型总是从托管堆上分配的,C#的new操作符会返回对象的内存地址.使用引用类型时,必须注意到一些性能问题. 1)内存必须从托管堆上 ...
- 《CLR via C#》读书笔记--基元类型、引用类型和值类型
编程语言的基元类型 编译器直接支持的数据类型称为基元类型.基元类型直接映射到Framework类库中存在的类型.例如:C#中的int直接映射到System.Int32类型.下表给出了C#基元类型与对应 ...
- 《CLR via C#》读书笔记(5)基元类型、引用类型和值类型
5.1 基元类型 编译器直接支持的数据类型称为基元类型(primitive type). 以下4行到吗生成完全相同的IL int a = 0; //最方便的语法 System.Int32 b = 0; ...
- <NET CLR via c# 第4版>笔记 第5章 基元类型、引用类型和值类型
5.1 编程语言的基元类型 c#不管在什么操作系统上运行,int始终映射到System.Int32; long始终映射到System.Int64 可以通过checked/unchecked操作符/语句 ...
- 【CLR Via C#】第5章 基元类型、引用类型、值类型
第二遍看这本书,决定记录一下加深印象. 1,基元类型 什么事基元类型?基元类型是直接映射到FrameWork类库(FCL)中存在的类型,编译器直接支持的数据类型.比如int直接映射到System.In ...
- 【转载】MDX Step by Step 读书笔记(三) - Understanding Tuples (理解元组)
1. 在 Analysis Service 分析服务中,Cube (多维数据集) 是以一个多维数据空间来呈现的.在Cube 中,每一个纬度的属性层次结构都形成了一个轴.沿着这个轴,在属性层次结构上的每 ...
随机推荐
- Webpack笔记(一)——从这里入门Webpack
准备了挺久,一直想要好好深入了解一下Webpack,之前一直嫌弃Webpack麻烦,偏向于Parcel这种零配置的模块打包工具一些,但是实际上还是Webpack比较靠谱,并且Webpack功能更加强大 ...
- java的串行化
参考博客:Java 对象的串行化(Serialization) 1,什么是串行化 对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把对象 ...
- 【转】python通过文件头判断文件类型
刚刚看到一个好玩的程序,拉过来.原文地址:https://www.ttlsa.com/python/determine-file-type-by-the-file-header/ 侵权删. ===== ...
- Django 数据模型的字段列表整理
一个模型最重要也是唯一必需的部分,是它定义的数据库字段. 字段名称限制: 1.一个字段名不能是一个Python保留字,因为那样会导致一个Python语法错误. 2.一个字段名不能包含连续的一个以上的下 ...
- ajax简单做html查询删除(鲜花)
下载视频+项目链接:https://pan.baidu.com/s/1jUld3-Nqm3fUAzFSX8kjlQ
- Subnet Routing Examples
Routing Table Each row in routing table contains: Destination IP address IP address of next-hop rout ...
- java从mysql读写数据乱码问题
mysql默认使用latin(ISO-8859-1),而java默认使用unicode编码.因此在JAVA中向MYSQL数据库插入数据时,或者读取数据时,都需要先转换一下编码方式. 1.首先查看数据库 ...
- python Web开发之 WSGI & uwsgi & uWSGI
首先弄清下面几个概念: WSGI 全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server ...
- div样式position:fixed,不随屏幕滚动而滚动,导致屏幕太小时弹出层被遮挡,无法滚动查看的解决办法
window.onscroll = function () { var sl = -Math.max(document.body.scrollTop, document.documentElement ...
- ABAP术语-R/3 Repository Information System
R/3 Repository Information System 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/11/1100076.ht ...