深入理解.net - 3.类型Type
说到类型,.NET技术是基于通用类型系统(CTS,Common Type System)的,而CTS又是构建于公共语言架构(CLI,Common Language Infrastructure)之上,CLI还包含有:通用中间语言(CIL,Common Intermediate Language ),公共语言规范(CLS,Common Language Specification)。我们编译的时候编译器会依据CTS规范将.NET语言统一处理成IL,从而实现了跨语言编程。
.NET主要类型:

值类型ValueType
如上图所示,主要包含:简单类型(int,bool等),枚举,结构体。值类型都继承自System.ValueType,而ValueType又继承字System.Object,既然根上是来自Object,为啥非要有搞出一套值类型呢,也可以理解成值类型有啥优势.
- 1.通常值类型都是存储在线程栈(stack)上,嵌套在引用类型里的值类型则是存储在托管堆中的,众所周知,栈的执行效率是很高的;
- 2.值类型变量本身存储的就是实例的值;
- 3.存储在栈上的值类型是用完就回收的;
引用类型 ReferenceType
引用类型,包含:类类型(其中比较特殊的就是string了,后续单独整理一下),接口,数组以及委托。实例都是分配在托管堆(managed heap)上,无论声明在值类型中还是引用类型中。引用类型的变量则是存储在线程栈stack上的,存储的是实例在托管堆上的地址引用。引用类型有啥特点:
- 1.实例都是创建在托管堆上的;
- 2.变量存储的是对实例的引用;
- 3.实例的生命周期由GC统一管理;
装箱Boxing和拆箱UnBoxing
装箱和拆箱主要还是针对值类型来说的,值类型转成引用类型,即为装箱;反之,则为拆箱;而引用类型则只有装箱一说。对值类型频繁的装箱拆箱是很耗性能的,为啥?因为值类型是存储在栈上的,引用类型是存储在堆上的,频繁的拆箱装箱,CLR就要频繁的将数据在栈和堆之前来回移动,你说累不累。
按值传递和按引用传递
通常情况下,CLR都是默认按值传递的,无论传递的参数是值类型还是引用类型。参数为值类型的时,传递的就是参数的值,而值类型参数的值就是实际的数据;参数为引用类型的时候,传递的也是参数的值,但引用类型参数的值存储的是托管堆上实例的引用地址。因此都是按值传递,参数的类型不同传递的值是有区别的。
按引用传递,需要借助关键字ref或者out关键字,它们使参数在传递时传递的是参数的地址,无论参数是值类型还是引用类型。个人感觉也可以理解成指针,指向了参数的地址。所以,添加了ref/out关键字的参数,在方法内部实际操作的还是传递的参数的本身。
总结
其实主要把握清楚值类型和引用类型的存储位置,基本上就对类型的使用有了比较深入的了解,不论是装箱拆箱还是类型的传递。
值类型总是创建在它声明的地方,而引用类型则总是创建在托管堆中。
最近也在梳理一些基础性知识,虽然大部分已经知道,但是还是会发现一些之前理解有偏差的地方,同时感觉好多知识点也慢慢都串起来了。回想之前一直在追赶新技术的脚步确实有点舍本逐末了。
深入理解.net - 3.类型Type的更多相关文章
- 深入理解计算机各种类型大小(sizeof)
深入理解计算机各种类型大小(sizeof) // Example of the sizeof keyword size_t i = sizeof( int ); struct align_dep ...
- orcle自定义类型type/create or replace type
一.type / create or repalce type 区别联系 相同: 可用关键字create type 或者直接用type定义自定义类型, 区别: create type 变量 as ta ...
- 初识Haskell 二:基本操作符、类型Type、数据结构
对Discrete Mathematics Using a Computer的第一章Introduction to Haskell进行总结.环境Windows 1. 在安装了ghci后,便可以进行Ha ...
- (转)深入理解Java注解类型(@Annotation)
背景:在面试时候问过关于注解的问题,工作中也用到过该java的特性,但是也没有深入的了解. 秒懂,Java 注解 (Annotation)你可以这样学 ps:注解最通俗易懂的解释 注解是一系列元数据, ...
- 第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型
第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型 Hash操作,redis中Hash在内存中的存储格式如下图: hset(name, key, value)name ...
- 转载:oracle 自定义类型 type / create type
标签:type create oracle object record 一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarc ...
- 关于语法节点Tree、类型Type和符号Symbol
每个语法节点Tree都有Type属性,部分的语法节点有Symbol属性,如下: 与Symbol类型与Type类型之间的关系如下: 下面是Symbol与Type之间的关系: (1)MethodSymbo ...
- 深入理解Java枚举类型(enum)
https://blog.csdn.net/javazejian/article/details/71333103 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(en ...
- oracle 自定义类型 type / create type
一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarchar2. 2.数值类型.如:int.number(p,s).integ ...
随机推荐
- Android数据库Realm实践
Android开发中常用的数据库有5个: 1. OrmLite OrmLite 不是 Android 平台专用的ORM框架,它是Java ORM.支持JDBC连接,Spring以及Android平台. ...
- MIDlet工作原理
题记 : 现在的J2ME用户已经是日益减少 , 开发也在转型! 无奈之下也不得不写下这系列文章来别了j2me ,也是对过去的一些总结吧! ①: 所有Kjava必须会继承自javax.microedi ...
- 属性动画之ValueAnimator
原文链接:http://blog.csdn.net/guolin_blog/article/details/43536355
- mybatis配置开发
以mysql为例: 一.需要的架包:mybatis.jar和mysql-connector-java.jar 二.一般会有两类配置文件:数据库配置文件和要执行的sql语句 数据库配置文件(配置文件中有 ...
- CMake添加-D_DEBUG宏
Linux下Debug版不会自动添加 _DEBUG宏,只有NDEBUG宏可用. cmake ../src _DCMAKE_BUILD_TYPE=Debug -D_DEBUG 会报错: -D_DEBUG ...
- PS 图像调整算法——自动色阶 (Auto Levels)
PS 给出的定义: Enhance Per Channel Contrast:Maximizes the tonal range in each channel to produce a more d ...
- 【编程练习】快速select算法的实现
代码来自: http://blog.csdn.net/v_JULY_v 算法思想: // Quick_select.cpp : 定义控制台应用程序的入口点. // #include "std ...
- OpenCV stereo matching 代码 matlab实现视差显示
转载请注明出处:http://blog.csdn.net/wangyaninglm/article/details/44151213, 来自:shiter编写程序的艺术 基础知识 计算机视觉是一门研究 ...
- OpenCV——PS 图层混合算法 (三)
具体的算法原理可以参考 PS图层混合算法之三(滤色, 叠加, 柔光, 强光) // PS_Algorithm.h #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ ...
- hadoop小知识札记
hadoop实现全局变量: 只读的可以,可修改的不行,只读的可以通过configuration 或者分布式缓存实现. hadoop做图像处理时,每个map读入一个图片,每个map读入一张图片,然后 ...