• 栈、堆、值类型、引用类型的说明和之间关系


      程序运行时,它的数据必须存储在内存中,一个数据项需要多大的内存、存储在什么地方、以及如何存储都依赖于数据项的类型。

    运行中的程序使用两个内存区域来存储数据:栈和堆。

      栈是一个内存数组,是一个LIFO(last-in、first-out,后进先出)的数据结构,栈存储3种类型的数据:分别是值类型变量的值;程序当前的执行环境;传递给方法的参数。

      栈有如下几个普遍特征,分别是:数据只能从栈的顶端插入与删除;把数据放到栈顶称为入栈;从栈顶删除数据称为出栈。

      堆是一块内存区域,在堆里可以分配大块的内存用于存储引用类型对象,与栈不同,堆里的内存能够以任意顺序存入和移除。虽然程序可以在堆里保存数据,但并不能显式的删除它们,CLR的自动GC(Garbage Collector,垃圾收集器)在判断出程序的代码将不会再访问某数据项时,自动清除无主的堆对象。

    值类型和引用类型

      值类型是一种类型数据的复制占有(即不存在多个变量共用一个值),只需要一段单独的内存,用于存储实际的数据,对于值类型而言,数据存放在栈里(不一定总是存放在栈里)。引用类型是一种对数据地址的引用(即可以存在多个变量共用一个值),需要两段内存,第一段存储实际的数据,它总是位于堆中;第二段是一个引用,指向数据在堆中的位置,存放在栈里。

      特别注意:值类型对象,或引用类型数据的引用部分可以存放在堆里,也可以存放在栈里,这依赖于实际环境。

      例如:假设有一个引用类型的实例,名称为MyType,它有两个成员:一个值类型成员A和一个引用类型成员B。它将如何存储,对于一个引用类型,其实例的数据部分始终存放在堆里,既然两个成员都是对象数据的一部分,那么它们都会被存放在堆里,无论它们是值类型还是引用类型。而且成员B的引用部分(即数据的指向位置)是存放在堆中的。

      C#中值类型和引用类型表格

    值类型

    引用类型

    预定义类型

    Sbyte、byte、float、short、ushort、double、int、uint、char、long、ulong、decimal、bool

    Object、string、dynamic

    用户定义类型

    Struct、enum

    Class、interface、delegate、array

  • 相关阅读:
    physicslectureGriavity
    electromagnetic
    dp
    physicsmechanic wave
    C# 2.0 Specification(迭代器)(二)
    C#类、接口、虚方法和抽象方法接口与抽象类的区别实例
    web.config connectionStrings 数据库连接字符串的解释(转载)
    onpropertychange事件
    C#中ParameterizedThreadStart和ThreadStart区别
    C# 文件操作全收录
  • 原文地址:https://www.cnblogs.com/zwt-blog/p/3424394.html
Copyright © 2020-2023  润新知