说到类型,.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. Eclipse 创建 Maven 项目、Maven JavaWeb 项目

    Eclipse 创建 Maven 项目         新建一个maven项目          (默认)(如果不行第一个Create a simple ... 也选中) 默认         Jav ...

  2. 【嵌入式开发】C语言 指针数组 多维数组

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21402047 . 1. 地址算数运算示例 指针算数运算 ...

  3. STL - stack(栈)

    Stack简介 stack是堆栈容器,是一种"先进后出"的容器. stack是简单地装饰deque容器而成为另外的一种容器. #include <stack> stac ...

  4. Material Design之视图状态改变

    视图状态改变是通过StateListAnimator动画集来改变View的状态的,它可以使View在不同状态下发生不同的变化,如下是在drawable目录下定义一个StateListAnimator: ...

  5. mybatis源码之PreparedStatementHandler

    /** * @author Clinton Begin */ public class PreparedStatementHandler extends BaseStatementHandler { ...

  6. web报表工具FineReport最经常用到部分函数详解

    之前分别列出来了finereport常用的文本.时间函数的解释,这里应广大朋友的要求,整理了finereport最常用到的一些函数! SUM SUM(number1,number2,-):求一个指定单 ...

  7. Java I/O最简单的几个类

    今天把I/O中最简单的几个类整理了一下,之所以整理最简单的,是因为这样会让我更加快速方便的理顺这里面的东西,以前每一次用的时候都要先百度一下,觉得很烦. 首先需要先看一下Read,Write和Stre ...

  8. LeetCode(37)-Minimum Depth of Binary Tree

    题目: Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the ...

  9. Oracle经常用到的一些函数

    1.数字函数 NVL( string1, replace_with) :如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值,如果两个参数都为NULL ...

  10. js定义数组的方法

    1.定义时赋值 var mycars=new Array("a","b","c") 2.new一个数组对象 var mycars=new A ...