一 C#内存分配

在应用程序与操作系统之间有一个”中间人”——公共语言运行时(Common Language Runtime,CLR)。它为应用程序提供内`存管理,线程管理和远程处理等核心服务。CLR是应用程序的托管环境。

CLR在运行时管理着一段内存地址空间(虚拟地址空间,在运行中会映射到物理内存地址中),CLR将内存划分为线程堆栈,GC堆,大对象堆三个区域。

       线程堆栈(栈)用于分配值类型实例。栈由操作系统进行管理,不受GC管理,当值类型不在其作用域(主要是指其所在函数内)时,其所占栈空间自动释放。栈的执行效率是非常高。GC堆(堆)用于分配小对象实例。所谓小对象就是大小小于85000字节的实例对象。GC堆分三代垃圾进行管理,当进行GC操作(垃圾回收)时,垃圾收集器会对GC堆进行压缩回收。大对象堆(LOH用于分配大对象实例。大对象就是大小小于85000字节的实例对象。大对象分配在LOH上,不受GC控制,不会被压缩,只有在完全GC回收时才会被回收。

二 C#数据类型

      C#是强类型语言,在C#程序中每个变量和对象都要声明类型。C#的数据类型可以分为值类型引用类型

C#中值类型包括三种:简单类型,枚举类型和结构类型。

值类型分类

类型

长度(位)

简单类型

整型

sbyte (有符号字节型)

8

byte (无符号字节型)

8

char  (字符型)

16

short  (短整型)

16

ushort (无符号短整型)

16

int (整型)

32

uint (无符号整型)

32

long (长整型)

64

ulong (无符号长整型)

64

浮点型

float(单精度)

精度为7位

double(双精度)

精度为15~16位

小数型

decimal

精度为28~29位

布尔型

bool

逻辑真或逻辑假

枚举型

枚举型

enum

结构型

结构型

struct

C#中引用类型包括类、接口、委托、数组、字符串等。

       数据存储:C#中值类型用于存储数据的值,而引用类型用于存储对实际数据的引用,即数据在堆内存中的存储位置编号(存储单元地址)。

类实例化对象时,CLR会根据其结构在堆内存中分配一片空间,对象的成员变量也存储在其中,基本类型和引用类型的成员变量都在这个对象的空间中,作为一个整体存储在堆。所有的对象都存储自己的非静态变量数据。而类的方法被所有的对象共享,方法不占据内存,只有在被调用时候才进栈。

       三 代码运行过程内存分析

class People

{

private string name;

private int age;

public People(string name, int age)

{

this.name = name;

this.age = age;

}

public void print()

{

Console.WriteLine("name:"+this.name+"age:"+this.age);

}

}

class Program

{

public static void Main(string[] args)

{

People p = new People("小明", 5);

p.print();

}

}

代码运行过程:

  1. 执行程序,加载程序进内存
  2. 主函数Main方法进栈
  3. 构造函数People("小明", 5)进栈,执行构造函数,在堆内存中分配一片区域(假设区域内存存储单元地址为0Xf001)用于存储对象值,对象成员变量初始时候name指向null引用指针,age=0.赋值后,name=”小明”,age=5.
  4. 构造函数出栈,继续执行Main方法
  5. 声明引用类型数据People p,将内存存储单元地址0Xf001赋值给p.
  6. p指向的对象的print()方法进栈,执行print()方法,print()出栈。
  7. 主函数出栈,程序结束。

备注:关于值类型与引用类型的数据内存回收请查看“第3篇 构造函数与析构函数”中相关内容。

第2篇 C#数据类型-值类型与引用类型的更多相关文章

  1. JavaScript数据类型--值类型和引用类型

    值类型:也称为原始数据或原始值(primitive value). 这类值存储在栈(stack)中,栈是内存中一种特殊的数据结构,也称为线性表,栈按照后进先出的原则存储数据,先进入的数据被压入栈底,最 ...

  2. 数往知来C#之接口 值类型与引用类型 静态非静态 异常处理 GC垃圾回收 值类型引用类型内存分配<四>

    C# 基础接口篇 一.多态复习 使用个new来实现,使用virtual与override    -->new隐藏父类方法 根据当前类型,电泳对应的方法(成员)    -->override ...

  3. c#数据类型之值类型和引用类型

    C#数据类型分隔为值类型和引用类型.而所用数据类型都继承自Object. 1. 值类型继承自System.ValueType,引用类型继承自System.Object.ValueType也直接继承自O ...

  4. .net学习之.net和C#关系、运行过程、数据类型、类型转换、值类型和引用类型、数组以及方法参数等

    1..net 和 C# 的关系.net 是一个平台,C#是种语言,C#语言可以通过.net平台来编写.部署.运行.net应用程序,C#通过.net平台开发.net应用程序2..net平台的重要组成FC ...

  5. C#入门篇6-7:字符串操作 看看字符串的特殊之处 值类型与引用类型的区别

    //看看字符串的特殊之处值类型与引用类型的区别 public static void CompareString(string stra, string strb, int i) { #region ...

  6. C#基础篇五值类型和引用类型

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace P01M ...

  7. Net基础篇_学习笔记_第十二天_面向对象继承(命名空间 、值类型和引用类型)

    命名空间可以认为类是属于命名空间的. 解决类的重名问题,可以看做类的“文件夹”如果在当前项目中没有这个类的命名空间,需要我们手动的导入这个类所在的命名空间.1).用鼠标去点2).alt+shift+F ...

  8. 【Unity|C#】基础篇(2)——栈与堆、值类型与引用类型

    传送门:https://www.cnblogs.com/moonache/p/6008048.html [笔记] 图1:值类型与引用类型 存储方式 > 值类型:数据直接存在栈中 > 引用类 ...

  9. .NET面试题解析(01)-值类型与引用类型

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还 ...

随机推荐

  1. 写博客 Why?

    博客?英文名字为blogger,它是一种网络日记. 一.我为什么要写博客? 这是我第一回写博客,写的可能不是非常的好,请多多给些意见.在平常的学习的时候,我怕忘掉自己学的知识,常常都会记录下来,但回头 ...

  2. PHP 支付

    蚂蚁金服开放平台 2.下载PHP的SDK&demo 3.申请应用 OR 使用沙箱环境 4.生成应用私钥&应用公钥 5.配置config.php 蚂蚁金服开放平台",对,没错, ...

  3. javaWeb 基础知识

    cookie  深度解析:  http://blog.csdn.net/ghsau/article/details/20395681 cookie 的作用: 利用存在客户端本地的缓存让无状态的服务器也 ...

  4. 关于echarts、layer.js和jqGrid的知识点

    使用echarts和layer.js直接去官方文档,能解决大部分问题. 但是有些问题,解释不够清楚,在这里记录一下. 1.echarts的使用 第一点:关于echarts的labelline在数据为零 ...

  5. Java规范推荐

    Java规范推荐 推荐:http://blog.csdn.net/tristansmile/article/details/7989670 命名规范 项目名:全部小写 Package 的命名:应该都是 ...

  6. C++流类库(11)

    C++的流类库由几个进行I/O操作的基础类和几个支持特定种类的源和目标的I/O操作的类组成. 流类库的基础类 ios类是isrream类和ostream类的虚基类,用来提供对流进行格式化I/O操作和错 ...

  7. LeetCode 572. Subtree of Another Tree (是否是另一个树的子树)

    Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and no ...

  8. 学习笔记TF052:卷积网络,神经网络发展,AlexNet的TensorFlow实现

    卷积神经网络(convolutional neural network,CNN),权值共享(weight sharing)网络结构降低模型复杂度,减少权值数量,是语音分析.图像识别热点.无须人工特征提 ...

  9. Charles从入门到放弃

    Charles版本:4.0.2 一.开始 连接方式 方法一:电脑和手机连接同一个wifi 方法二:电脑使用网线连接网络,手机通过USB连接电脑 二.过滤网络请求 1.简单过滤 在Sequence模式下 ...

  10. angular核心$watch,$digest,$apply之间的联系

    浏览器事件发生时,会在浏览器的上下文window中执行,而angular有自己的上下文angular content,angular 事件在自己的上下文angular content中执行. $wat ...