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的构造器,该构造器什么也不做,简单的返回对象指针。

  • 相关阅读:
    PHP安装linux
    nginx 安装
    Redis安装
    linux启动http服务
    收藏的有用的网页
    laravel框架部署后有用命令
    .net 报错access to the path c: empimagefilesmsc_cntr_0.txt is denied
    oracle 触发器
    学习Auxre记录
    mysql数据库索引
  • 原文地址:https://www.cnblogs.com/zk3113/p/5958172.html
Copyright © 2011-2022 走看看