说到类型,.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的更多相关文章

  1. 深入理解计算机各种类型大小(sizeof)

    深入理解计算机各种类型大小(sizeof)   // Example of the sizeof keyword size_t  i = sizeof( int ); struct align_dep ...

  2. orcle自定义类型type/create or replace type

    一.type / create or repalce type 区别联系 相同: 可用关键字create type 或者直接用type定义自定义类型, 区别: create type 变量 as ta ...

  3. 初识Haskell 二:基本操作符、类型Type、数据结构

    对Discrete Mathematics Using a Computer的第一章Introduction to Haskell进行总结.环境Windows 1. 在安装了ghci后,便可以进行Ha ...

  4. (转)深入理解Java注解类型(@Annotation)

    背景:在面试时候问过关于注解的问题,工作中也用到过该java的特性,但是也没有深入的了解. 秒懂,Java 注解 (Annotation)你可以这样学 ps:注解最通俗易懂的解释 注解是一系列元数据, ...

  5. 第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型

    第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型 Hash操作,redis中Hash在内存中的存储格式如下图: hset(name, key, value)name ...

  6. 转载:oracle 自定义类型 type / create type

    标签:type create oracle object record 一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarc ...

  7. 关于语法节点Tree、类型Type和符号Symbol

    每个语法节点Tree都有Type属性,部分的语法节点有Symbol属性,如下: 与Symbol类型与Type类型之间的关系如下: 下面是Symbol与Type之间的关系: (1)MethodSymbo ...

  8. 深入理解Java枚举类型(enum)

    https://blog.csdn.net/javazejian/article/details/71333103 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(en ...

  9. oracle 自定义类型 type / create type

    一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarchar2. 2.数值类型.如:int.number(p,s).integ ...

随机推荐

  1. Android数据库Realm实践

    Android开发中常用的数据库有5个: 1. OrmLite OrmLite 不是 Android 平台专用的ORM框架,它是Java ORM.支持JDBC连接,Spring以及Android平台. ...

  2. MIDlet工作原理

    题记 :  现在的J2ME用户已经是日益减少 , 开发也在转型! 无奈之下也不得不写下这系列文章来别了j2me ,也是对过去的一些总结吧! ①: 所有Kjava必须会继承自javax.microedi ...

  3. 属性动画之ValueAnimator

    原文链接:http://blog.csdn.net/guolin_blog/article/details/43536355

  4. mybatis配置开发

    以mysql为例: 一.需要的架包:mybatis.jar和mysql-connector-java.jar 二.一般会有两类配置文件:数据库配置文件和要执行的sql语句 数据库配置文件(配置文件中有 ...

  5. CMake添加-D_DEBUG宏

    Linux下Debug版不会自动添加 _DEBUG宏,只有NDEBUG宏可用. cmake ../src _DCMAKE_BUILD_TYPE=Debug -D_DEBUG 会报错: -D_DEBUG ...

  6. PS 图像调整算法——自动色阶 (Auto Levels)

    PS 给出的定义: Enhance Per Channel Contrast:Maximizes the tonal range in each channel to produce a more d ...

  7. 【编程练习】快速select算法的实现

    代码来自: http://blog.csdn.net/v_JULY_v 算法思想: // Quick_select.cpp : 定义控制台应用程序的入口点. // #include "std ...

  8. OpenCV stereo matching 代码 matlab实现视差显示

    转载请注明出处:http://blog.csdn.net/wangyaninglm/article/details/44151213, 来自:shiter编写程序的艺术 基础知识 计算机视觉是一门研究 ...

  9. OpenCV——PS 图层混合算法 (三)

    具体的算法原理可以参考 PS图层混合算法之三(滤色, 叠加, 柔光, 强光) // PS_Algorithm.h #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ ...

  10. hadoop小知识札记

    hadoop实现全局变量: 只读的可以,可修改的不行,只读的可以通过configuration 或者分布式缓存实现.   hadoop做图像处理时,每个map读入一个图片,每个map读入一张图片,然后 ...