zoukankan      html  css  js  c++  java
  • C#中 栈,堆你真的懂吗?不理解引用类型和值类型区别的程序员将会给代码引入诡异的bug和性能问题

    1.C#中 栈,堆是程序运行时的内存区域,存放不同类型的数据;一般情况是值类型存放在栈中,引用类型存储在堆中(引用地址在栈中,值在堆中)

    2.栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;值类型,栈里的内存只能后进先出,值类型只需要一段单独的内存,用于存储实际的数据

    3.堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小,堆里的内存能够以任意顺序存入和移除,
    引用类型需要两段内存
    第一段存储实际的数据,它总是位于堆中
    第二段是一个引用,指向数据在堆中的存放位置
    如果数组是一个值类型的数组,那么数组中直接存储值,如果是一个引用类型的数组(数组中存储的是引用类型),那么数组中存储的是引用(内存地址)

    4.值类型(value type):byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。值类型变量声明后,不管是否已经赋值,编译器为其分配内存。
    当我们程序执行的时候,在栈和堆中分配有四种主要的类型:值类型,引用类型,指针,指令。

    6.引用类型(reference type):string 和 class统称为引用类型。当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间。当使用 new 创建一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的小片空间中。
    关键字new将在托管堆上分配内存空间,并返回一个该内存空间的地址。左边的reference位于栈上,是一个引用,存储着一个内存地址

    7.在C#中,继承自System.ValueType的类型被称为值类型,主要有以下几种(CLR2.0中支持类型有增加):
    * bool
    * byte
    * char
    * decimal
    * double
    * enum
    * float
    * int
    * long
    * sbyte
    * short
    * struct
    * uint
    * ulong
    * ushort

    引用类型:
    以下是引用类型,继承自System.Object:
    * class
    * interface
    * delegate
    * object
    * string

    * array

  • 相关阅读:
    日期格式
    v-model修饰符
    从0到1构建全栈知识体系
    Element组件,v-for循环,表单验证方法
    上传文件转换为base64图片
    gulp4进阶
    gulp4快速入门
    TS-接口
    webpack4.0高级
    webpack4.0基础
  • 原文地址:https://www.cnblogs.com/csj007523/p/14912208.html
Copyright © 2011-2022 走看看