[CLR via C#]引用类型和值类型
一、引用类型与值类型的区别
CLR支持两种类型:引用类型和值类型。引用类型总是从托管堆上分配的,C#的new操作符会返回对象的内存地址。使用引用类型时,必须注意到一些性能问题。
1)内存必须从托管堆上分配。
2)堆上分配的每个对象都有一些额外的成员(类型对象指针和同步索引块),这些成员必须初始化。
3)对象中的其他字节(为字段而设)总是设为零。
4)从托管城市化上分配一个对象时,可能强制执行一次垃圾收集操作。
为了提升简单的、常用的类型的性能,CLR提供了名为"值类型"的轻量级类型。值类型的实例一般在线程栈上分配(虽然也可以作为字段嵌入一个引用类型的对象中)。在代表值类型的实例中,并不包含一个指向实例的指针。相反,变量中包含了实例本身的字段。由于变量已经包含了实例的字段,所以为了操作实例中的字段,不再需要提取一个指针。值类型的实例不受垃圾回收器的控制。因此,值类型的使用缓解了托管堆中的压力,并减少了一个应用程序在其生存期内需要进行的垃圾回收次数。
二、将类型声明为值类型的条件
设计自己的类型时,要仔细地考虑是否应该将一个类型定义成值类型,而不是定义成引用类型。某些时候,值类型能提供更好的性能。具体地说,除非以下所有条件满足,否则不应该将一个类型声明为值类型。
1)类型具有基元类型的行为。换言之,这是一个十分简单的类型,其中没有成员会修改类型的任何实例字段。建议将值类型的全部字段声明为readonly。
2)类型不需要从其他任何类型继承。
3)类型也不会派生出其他任何类型。
类型实例的大小也应在考虑之列。因为在默认情况下,实参是以传值方式传递的,这会造成对值类型实例中的字段进行复制,从而损害性能。同样地,被定义成返回一个值类型的一个方法在返回时,实例中的字段会复制到调用者分配的内存中,从而损害性能。
三、值类型的优势与劣势
值类型的主要优势在于它们不作为对象在托管堆上分配。当成,与引用类型相比,值类型也存在自身的一些局限。
1)值类型对象有两种表示形式:未装箱和已装箱形式。
2)由于不能将一个值类型作为基类型来定义一个新的值类型或者一个新的引用类型,所以不应该在值类型中引入任何新的虚方法。所以方法都不能是抽象的,而且所有方法都隐式地为密封方法。
3)将一个值类型的变量赋值给另一个值类型变量,会执行一次逐字段的复制。将引用类型的变量赋给另一个引用类型的变量时,只复制内存地址。
[CLR via C#]引用类型和值类型的更多相关文章
- 《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; ...
- 【CLR Via C#】第5章 基元类型、引用类型、值类型
第二遍看这本书,决定记录一下加深印象. 1,基元类型 什么事基元类型?基元类型是直接映射到FrameWork类库(FCL)中存在的类型,编译器直接支持的数据类型.比如int直接映射到System.In ...
- CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段
编程语言的基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32(); // a = 0 a = 1 ...
- [CLR via C#]5.2 引用类型和值类型
原文:[CLR via C#]5.2 引用类型和值类型 CLR支持两种类型:引用类型和值类型. 虽然FCL中大多数都是引用类型,但开发人员用的最多的还是值类型.引用类型总是在托管堆上分配的,C#的ne ...
- CLR via C#读书日记一' 引用类型和值类型'
CLR支持两种类型:引用类型和值类型. 引用类型总是在托管堆上分配的,C#的new操作符会返回对象的内存地址——也就是指向对象数据的内存地址. 使用引用类型必须注意到一些问题: 1)内存必须从托管堆上 ...
- <NET CLR via c# 第4版>笔记 第5章 基元类型、引用类型和值类型
5.1 编程语言的基元类型 c#不管在什么操作系统上运行,int始终映射到System.Int32; long始终映射到System.Int64 可以通过checked/unchecked操作符/语句 ...
- 重温CLR(四)基元类型、引用类型、值类型
编程语言的基元类型 编译器直接支持的数据类型称为基元类型(primitive type).基元类型直接映射到framework类型(fcl)中存在的类型. 下表列出fcl类型 从另一个角度,可以认为C ...
- CLR via C#(02)-基元类型、引用类型、值类型
http://www.cnblogs.com/qq0827/p/3281150.html 一. 基元类型 编译器能够直接支持的数据类型叫做基元类型.例如int, string等.基元类型和.NET框架 ...
随机推荐
- Java学习笔记十七:Java中static使用方法
Java中static使用方法 一:Java中的static使用之静态变量: 我们都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立.然而在某些时候,我们更希望该类所有的 ...
- 分享一个强大的makedown编辑器
Yosoro 官网地址 https://yosoro.coolecho.net/ 很强大,支持直接粘贴图片,是直接上传到github仓库. 可直接导出md,html,pdf格式,特别方便 找了好几天的 ...
- 20154327 Exp3 免杀原理与实践
实践内容 基础问题回答 (1)杀软是如何检测出恶意代码的? 杀毒软件主要靠特征码进行查杀,匹配到即为病毒. 还有通过云查杀,查看云端库中该文件是否属于恶意代码. 跟踪该程序运行起来是否存在恶意行为,来 ...
- BZOJ3436_小K的农场_KEY
题目传送门 差分约束基础,对于每种关系建不同的边,求是否有负环. code: /************************************************************ ...
- MySql——查看数据库性能基本参数
使用show status可以查看数据库性能的参数,基本语法:show status like 'value'; 例如: show status like 'Connections';/*连接mysq ...
- Python之多进程多线程
一.多进程与多线程的概念 1.多进程的概念 进程是程序在计算机上的的一次执行活动.当你运行一个程序,你就启动了一个进程.显然,程序是死的(静态的),进程是活的(动态的).进程可以分为系统进程和用户进程 ...
- struts2-01:作用域传值
方式一.使用ServletActionContext(耦合度高,不建议使用) public String login(){ ServletActionContext.getRequest().getS ...
- NB-IOT使用LWM2M移动onenet对接之MTU最大传输单元设置
1. 最近遇到的一个项目NB-IOT使用LWM2M移动onenet对接,要求设置传输的MTU,因此首先需要搞懂MTU是什么? 以太网的MTU值是1500 bytes,假设发送者的协议高层向IP层发送了 ...
- 游戏人工智能 读书笔记 (四) AI算法简介——Ad-Hoc 行为编程
本文内容包含以下章节: Chapter 2 AI Methods Chapter 2.1 General Notes 本书英文版: Artificial Intelligence and Games ...
- hdu1422重温世界杯(动态规划,最长子序列)
重温世界杯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...