zoukankan      html  css  js  c++  java
  • 品味类型——值类型和引用类型

    基本概念

    值类型(Value Type):

      值类型实例通常分配在线程的堆栈(Stack)上,并且不包含任何执行实例数据的指针,因为变量本身就包含了其数据实例。其在MSDN的定义为:值类型直接包含它们的数据,值类型的实例要么在堆栈上,要么在内联在结构中。

    值类型主要包含:简单类型、结构体类型、枚举类型等。通常声明为一下类型:int、char、float、long、bool、struct、enum、short、byte、decimal、等等。

    引用类型(Reference Type):

      引用类型实例分配在托管堆(managed heap)上,变量保存了实例数据的内存引用。其在MSDN中的定义为:引用类型存储对值的内存地址的引用,位于堆上。引用类型可以是自描述类型、指针类型或接口类型。而自描述类型可以进一步细分为数组和类类型。

    内存中的分配

      值类型实例总是分配在它声明的地方,声明为局部变量时其被分配在堆栈上,声明为引用类型成员时其被分配在托管堆上;引用类型实例总是分配在托管堆上。

    通用规则

      >.string类型是个特殊的引用类型,具有Immutability特性(相同的string在内存只有一个),因此每次对string的改变都会在托管堆中产生一个新的string变量。另外string类型重装了==操作符,比较的是实际的字符串,而不是引用地址,这一点和值类型一样

      >.引用类型在性能上不如值类型,主要是因为一下几方面:

        a.引用类型变量要分配在托管堆上;内存释放则有GC完成,GC执行时会遍历所有的托管堆对象,按照一定的递归遍历算法找出所有的可达对象和不可访问的对象,对于不可访问的对象会释放回收内存,造成一定的GC堆压力。

        b.必须同时完成对其附加成员的内存分配过程

            值类型的内存不由GC控制,作用域结束时,值类型会自动释放。处理数据较小的情况时,应优先考虑使用值类型。

      >.值类型都继承自System.ValueType,而System.ValueType又继承自System.Object,其主要区别是ValueType重写了Equals方法,实现对值类型按照实例值比较而不是引用地址比较。

      >.基元类型,是指编译器直接支持的类型。例如:int对应于System.Int32。

    类型的判等

      参考:http://www.cnblogs.com/qianxingdewoniu/p/3604136.html

  • 相关阅读:
    shell 知识点
    辅助字符串处理类:org.apache.commons.lang3.StringUtils
    post请求(headers里有属性)报错:Request header field xxx is not allowed by Access-Control-Allow-Headers in preflight response
    vue-cli 打包报错:Unexpected token: punc (()
    遍历对象,并对其中第一个(随机)进行处理
    JavaScript中类似PHP的uniqid()方法
    使用crypto-js的md5加密
    Yarn、MapReduce、spark、storm的关系
    hadoop 知识点
    spring cloud 知识点
  • 原文地址:https://www.cnblogs.com/qianxingdewoniu/p/5644972.html
Copyright © 2011-2022 走看看