[Clr via C#读书笔记]Cp5基元类型引用类型值类型
Cp5基元类型引用类型值类型
基元类型
编译器直接支持的类型,基元类型直接映射到FCL中存在的类型。
作者希望使用FCL类型名称而避免使用关键字。他的理由是为了更加的清晰的知道自己写的类型是哪种。但是实际当中关键字更常用,FCL类型的写法太繁琐了。特别是你不用过多考虑和其他语言交互的时候,只使用C#的时候。所以这一点上我还是不同意作者的看法。
类型的隐式转换和显示转换过程中的可能存在的问题。checked,unchecked;来检查溢出;
CLR并不认为Decimal是基元类型,所以执行速度要慢很多。
引用类型和值类型
引用类型在托管堆上创建,new后返回其在托管堆上的地址,受GC控制,引用变量还是在栈上,用来存储引用,没有的时候存的就是null。
而值类型则在线程栈上创建,其保存的就是值本身而不是地址,不受GC控制。结构,枚举,派生自System.ValueType,全都是Sealed。
Struct使用new的目的和引用类型不同,是为了初始化内部成员,如果不使用new来初始化内部成员,也可以使用对象.成员的方式一个一个设置,就是比较麻烦。可以给Struct设置一个带参数的构造函数,这个构造函数的目的也是为了初始化内部成员,不是为了创建结构。
可空类型nullable
值复制会复制值本身,引用复制只会复制引用;
装箱和拆箱
装箱和拆箱的含义这一块很好理解。 装箱拆箱影响性能,所以尽量避免。要会分析给定代码的装箱拆箱次数。大多数方法进行重载的唯一目的是为了减少装箱拆卸操作。
- 对没有装箱的值类型(主要是说Struct),直接调用虚方法。
- 重写的虚方法调用方法在基类中的实现,那么该值类型会被装箱,以便通过this指针引用对一个堆对象的引用传递给基方法。
- 调用非虚的继承自Object的的方法需要装箱,因为需要的this指向的是堆上的实例的引用 。
- 将值类型未装箱的实例传递给接口的时候,会装箱,因为接口对应的是引用。
书上这里写的也比较绕口,具体参考P122的例子,例子和例子的解释都非常的清楚。
C#不允许更改已装箱的值。
相等性和同一性
Equals方法=同一性identity;重写Equals;静态方法ReferenceEquals;
接口System.IComparable,System.IComparable,CompareTo方法
对象HashCode
两个对象相等,必须要有相同的hashcode.
dynamic基元类型
本质就是Object。
动态化显著简化了COM对象互操作。
C#的动态支持会产生大量开销,所以使用的时候要考虑清楚。
[Clr via C#读书笔记]Cp5基元类型引用类型值类型的更多相关文章
- CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段
编程语言的基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32(); // a = 0 a = 1 ...
- CLR via c#读书笔记五:方法
注:书本第8章:方法 实例构造器和类(引用类型) 构造器方法在“方法定义元数据表”中始终叫做.ctor(constructor的简称). 构造引用类型的对象,在调用类型的实例构造器之前,为对象分配的内 ...
- CLR via C#(02)-基元类型、引用类型、值类型
http://www.cnblogs.com/qq0827/p/3281150.html 一. 基元类型 编译器能够直接支持的数据类型叫做基元类型.例如int, string等.基元类型和.NET框架 ...
- C#中的基元类型、值类型和引用类型
C# 中的基元类型.值类型和引用类型 1. 基元类型(Primitive Type) 编译器直接支持的类型称为基元类型.基元类型可以直接映射到 FCL 中存在的类型.例如,int a = 10 中的 ...
- CLR via #C读书笔记三:基元类型、引用类型和值类型
1.一些开发人员说应用程序在32位操作系统上运行,int代表32位整数:在64位操作系统上运行,int代表64位整数.这个说法是完全错误的.C#的int始终映射到System.Int32,所以不管在什 ...
- Clr Via C#读书笔记----基元线程同步构造
线程文章:http://www.cnblogs.com/edisonchou/p/4848131.html 重点在于多个线程同时访问,保持线程的同步. 线程同步的问题: 1,线程同步比较繁琐,而且容易 ...
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_基元类型(二)
[基元类型推荐] 推荐直接使用 FCL 类型. [理由] 编码时不至于困惑string与String的使用.由于C#的stirng(一个关键字)直接映射到System.String(一个 FCL 类型 ...
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_基元类型(一)
[概念] 编译器直接支持的数据类型 [C#基元类型与对应的 FCL 类型] C#基元类型 FCL 类型 说明 sbyte System.Sbyte 有符号8位值 byte System.Byte 无符 ...
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_基元类型(三)
[checked 和 unchecked 基元类型操作] 1.第一种使用方式 UInt32 invalid = )); //OK,不会抛异常 Byte b = ; b = ));//抛出Overflo ...
随机推荐
- ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现
ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现 承接 http://www.wowotech.net/pm_subsystem/suspend_and_re ...
- linuxc - entos 7.3 开放端口并对外开放
1. 查看已打开的端口 # netstat -anp 2. 查看想开的端口是否已开 # firewall-cmd --query-port=666/tcp 若此提示 FirewallD is not ...
- Xcode 怎么查看代码总行数
打开终端 输入 cd 空格 你的工程路径这里有一个小技巧,你把要统计的文件夹直接拖住拖到终端里,路径就出来了.然后输入find . -name "*.m" -or -name &q ...
- 20181030noip模拟赛T1
YY的矩阵 YY有一个大矩阵(N*M), 矩阵的每个格子里都有一个整数权值W[i,j](1<=i<=M,1<=j<=N) 对于这个矩阵YY会有P次询问,每次询问这个大矩阵的一个 ...
- Linux通过Shell脚本命令修改密码不需要交互
交互方式修改密码 1. ssh 远程到主机: 2. 切换到root账号: [一般都是切换到root进行密码修改,如果普通用户修改自己的密码,要输入原密码,然后新密码要满足复杂度才OK]: 3. pas ...
- 【小尝试】Java获取慕课网原有路径课程列表
作为一个老慕课网(https://www.imooc.com/)粉丝,还记得最开始的慕课网有很多免费的路径课程,练习什么的也特别详细,是入门一门语言的好方法. 现在慕课网发展起来了收费模式,添加了很多 ...
- openstack之kvm常用操作
KVM虚拟机的管理主要是通过virsh命令对虚拟机进行管理. 1. 查看KVM虚拟机配置文件及运行状态 KVM虚拟机默认配置文件位置: /etc/libvirt/qemu/ autostart目录 ...
- table表单制作个人简历
应用table表单,编程个人简历表单,同时运用了跨行rowspan和跨列colspan. <!DOCTYPE html> <html> <head> <met ...
- hadoop生态搭建(3节点)-17.sqoop配置_单节点
# ==================================================================安装 sqoop tar -zxvf ~/sqoop-1.4.7 ...
- 树莓派编译程序时报错:virtual memory exhausted: Cannot allocate memory
一.原因分析: 树莓派内存太小,编译程序会出现virtual memory exhausted: Cannot allocate memory的问题,可以用swap扩展内存的方法. 二.解决方法: 安 ...