说到类型,.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. C语言的指针的基本语法

    这是我在C++编程的一本教科书偶然看到的,就当做一个查询的资料吧

  2. (十六)TableView常见属性

    千万不要忘记设置TableView的数据源. 1.分割线的样式: separatorStyle与separatorColor. 颜色:十六进制表示 32bit:argb各占8位. #aarrggbb ...

  3. 网站开发进阶(二十)JS中window.alert()与alert()的区别

    JS中window.alert()与alert()的区别 前言 alert与window.alert没什么区别,如果有人觉得有区别,那就来解释一下:所有以window.开始的语句,都可以直接把wind ...

  4. 关于Android的https通讯安全

    原文链接:http://pingguohe.net/2016/02/26/Android-App-secure-ssl.html 起因 前段时间,同事拿着一个代码安全扫描出来的 bug 过来咨询,我一 ...

  5. MySQL数据库存储过程动态表建立(PREPARE)

    PREPARE statement_name FROM sql_text /*定义*/ EXECUTE statement_name [USING variable [,variable...]] / ...

  6. LeetCode之旅(19)-Power of Two

    题目 Given an integer, write a function to determine if it is a power of two. Credits: Special thanks ...

  7. 关于ARC的介绍和ARC与MRC混编解决

    1. ARC & MRC 混合开发 在项目开发中,遇到使用MRC开发的第三方库怎么办? 例如:ASI 1> 尝试使用Xcode的转换工具(失败率比较高) 2> 在编译选项中,为MR ...

  8. Xcode使用心得02:如何在项目中关闭ARC特性

    在obj-c系列内存管理的博文里大家应该对ARC有所了解,一般是不推荐关闭ARC特性的,但你也保不齐啥时候有这个需求,于是乎我们看看在最新的x6b中如何将其关闭吧. 因为Build Seting里的子 ...

  9. OVS 中的哈希表: shash

    shash出现在OVS的代码中,定义如下:   struct hmap_node {     size_t hash;     struct hmap_node * next; };   struct ...

  10. palindrome number(回文数)

    Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could negativ ...