[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 ...
随机推荐
- linux mysql命令行查看显示中文
linux 命令行查看mysql的库字符集是utf8,查询某个表时,仍然是显示不了中文, 之后使用了命令 mysql>set names utf8;就可以正常显示中文了. 如何才更好的使mys ...
- 【centOS7.3 彻底卸载MySQL】
废话不多说,直接正面刚. 1.删除MySQL yum remove mysql mysql-server mysql-libs mysql-server; 执行后继续查找相关文件 find / -na ...
- CF1066EBinary Numbers AND Sum(前缀和,二进制)
题目大意 现在,给你两个位数为 n 和 m 的两个二进制数a,b,现在,我们要进行如下操作: 计算a&b 答案累加上一个操作的值 bbb右移一位,最后一位直接舍弃 现在,请你算出最终的答案,并 ...
- C++切勿混用带符号类型和无符号类型
如果表达式里既有带符号类型又有无符号类型,当带符号类型取值为负时会出现异常结果. 因为带符号数会自动转化为无符号数. 例如 a*b,a=-1, b=1,a是int,b是unsigned int,如果在 ...
- fastdfs安装过程
Fastdfs于centos7的安装步骤(支持横向拓展) 主要目的:根据网上教程搭建时遇到的问题以及描述不明确的地方进行补充和说明 一.首先需要准备以下4个文件 nginx-1.12.0.tar.gz ...
- jQuery 动画效果 与 动画队列
基础效果 .hide([duration ] [,easing ] [,complete ]) 用于隐藏元素,没有参数的时候等同于直接设置 display 属性 $('.target').hide() ...
- 【NXP开发板应用—智能插排】2.初步解析example之GPI
[前言] 首先感谢深圳市米尔科技有限公司举办的这次活动并予以本人参加这次活动的机会,以往接触过嵌入式,但那都是皮毛,最多刷个系统之类的,可以说对于嵌入式系统开发这件事情是相当非常陌生的,这次活动为我提 ...
- python 爬虫(爬取网页的img并下载)
from urllib.request import urlopen # 引用第三方库 import requests #引用requests/用于访问网站(没安装需要安装) from pyquery ...
- Java学习笔记十八:Java面向对象的三大特性之封装
Java面向对象的三大特性之封装 一:面向对象的三大特性: 封装 继承 多态 二:封装的概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访 ...
- 组播___IGMP
一.基本概念: 1.协议概述: 是运行在主机和与主机直连的路由器之间,其实现的功能是双向的:一方面,主机通过IGMP通知路由器希望接收某个特定组播组的信息:另一方面,路由器通过IGMP周期性地查询局域 ...