说到类型,.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. NSDate-日期类 OC——第七天(1)

    1.总结前面学习的Oc中的几种数据类型 NSInteger NSUinteger CGFloat NSString NSMutableString NSSArray NSMutableArray NS ...

  2. python“# -*- coding: UTF-8 -*-”

    python跑一趟红 python脚本文件中,python编译器是使用ascii码来解释脚本内容.如果.py源文件中包含中文,会报错(注释也报错).所以文件开头加上"# -*- coding ...

  3. 高通平台手机开发之LCD

    4.1. LCD 参考文档: 1) 80-NA157-174_E_DSI_Programing_Guide_B-Family_Android_Devices.pdf 2) 80-NN766-1_A_L ...

  4. Material Design之CardView的使用

    本文介绍CardView这个控件的使用,CardView继承至FrameLayout类,是support-v7包下的一个类,使用时必须引入cardview依赖包,可在下载的sdk文件夹中找到... 使 ...

  5. DigitalClock的替代者TextClock

    DigitalClock在API 17(Android4.2)中就被官方定义为过时的方法,很奇怪为什么现在很多的网上的帖子都介绍DigitalClock方法的使用(已经过时),如果你想让自己的应用在高 ...

  6. Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解

    前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式--在一个独立的文件夹通过makefile配合内核源码路径完成 那么如何将驱动直接编译进内核呢? ...

  7. Android LruCache技术原理

    概述 记得在很早之前,我有写过一篇文章Android高效加载大图.多图解决方案,有效避免程序OOM,这篇文章是翻译自Android Doc的,其中防止多图OOM的核心解决思路就是使用LruCache技 ...

  8. cocos2d-x action执行完毕的回调

    cocos2d-x action执行完毕的回调 MySprite::createOne() { .... //  MUST add to sheet firstly        spriteShee ...

  9. Mondrian Schema workbench工作界面 简介(实在懒得写,居然有人弄了,收藏了)

    转自:http://hi.baidu.com/dinguangx/item/37e78be29aebc1adcf2d4f89 Schema Schema 定义了一个多维数据库.包含了一个逻辑模型,而这 ...

  10. Android群英传笔记——第一章:Android体系与系统架构

    Android群英传笔记--第一章:Android体系与系统架构 图片都是摘抄自网络 今天确实挺忙的,不过把第一章的笔记做一下还是可以的,嘿嘿 1.1 Google的生态圈 还是得从Android的起 ...