zoukankan      html  css  js  c++  java
  • 值类型和引用类型、装箱和拆箱、new关键词的作用

    一、值类型和引用类型的区别

    值类型 引用类型
    一般在线程栈上分配 必须从托管堆中分配,且从托管堆分配对象时,可能强制执行一次垃圾回收
    值变量赋值是进行数据传递,两个值变量互不影响 引用类型赋值仅仅是把对象的引用指针赋值给变量,两个变量之间互相影响
    值类型都继承自System.ValueType   引用类型都不继承自System.ValueType
    不受垃圾回收的控制 受垃圾回收的控制

    简单类型(int,byte,char,float,decimal,bool)

    枚举类型

    结构类型

    类类型

    接口类型

    数组类型

    委托类型

    二、装箱和拆箱

      装箱是指将一个值类型转换为引用类型的过程

      拆箱是指将一个引用类型显式地转换成值类型

    装箱做了那几件事?

    1)、在托管堆中分配内存(内存量=值类型个字段所需要的内存量+类型对象指针和同步块索引的内存量)。

    2)、值类型的字段复制到新分配的堆内存。

    3)、返回对象地址。

    拆箱做了那几件事?

    1)、根据指针获取该指针指向包含一个对象中的原始值类型。

    既然装箱做了这么多的事情,所以我们要斟酌使用,多数情况使用泛型来应对,一个方法试用于多种类型的情况。

    三、new关键词做了几件事情

    1)、计算字节总数(计算类型及其所有基类型中定义的所有实例字段需要的字节数+每个对象的类型对象指针和同步块索引需要的字节数。

    2)、从托管堆中分配类型要求的字节数,从而分配对象内存,分配的所有字节都设为0。

    3)、初始化对象的类型对象指针和同步块索引

    4)、调用类型的实例构造器,传递new调用中指定实参(如果有)。ps:大多数编译器都在构造器中自动生成代码来调用基类构造器,每个类型的构造器都负责初始化该类型定义的实例字段,最终调用System.Object的构造器,该构造器什么也不做,简单的返回对象指针。

  • 相关阅读:
    BZOJ 2006: [NOI2010]超级钢琴 [ST表+堆 | 主席树]
    CF 741D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths [dsu on tree 类似点分治]
    CF 716E. Digit Tree [点分治]
    CF 291E. Tree-String Problem [dfs kmp trie图优化]
    CF 208E. Blood Cousins [dsu on tree 倍增]
    CF 246E. Blood Cousins Return [dsu on tree STL]
    CF 570D. Tree Requests [dsu on tree]
    [dsu on tree]【学习笔记】
    测试markdown
    BZOJ 1969: [Ahoi2005]LANE 航线规划 [树链剖分 时间倒流]
  • 原文地址:https://www.cnblogs.com/zk3113/p/5958172.html
Copyright © 2011-2022 走看看