一 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. 关于如何绑定Jquery 的scroll事件(兼容浏览器 Wookmark瀑布流插件)

    做一个随屏幕滚动的导航条时,发现一个问题: 火狐.谷歌.ie9正常,ie8.7.6页面滚动时,导航条没有反应. 代码如下: $(document).bind("scroll",fu ...

  2. [置顶] 一个demo学会c#

    学习了c#4.5高级编程这本书,自己喜欢边学边总结边写demo,所以写了这篇文章,包含了大部分的c#编程知识.让你一个demo掌握c#编程,如果有问题可以留言. 此demo主要包括五个文件:Stude ...

  3. 全球多个 TOP 网站藏挖矿代码,5 亿 PC 沦为矿工

    据ZDNet报道,现在很多网站都开始在网页脚本中藏匿挖矿代码,在用户访问时偷算力用于挖矿.来自Adguard的报告称也证实,也有5亿台电脑中招. 最新最热的IT技术付费社区 IT帮 itbang.me ...

  4. windowsxp_电脑桌面显示不出来。

    问题:在工作的时候遇到电脑桌面显示不出来 解决方案: 1.结束explorer.exe进程 2.新建一个explorer.exe进程

  5. PHP中header的作用

    1.跳转: //若等待时间为0,则与header("location:")等效.  //Header("Location:http://localhost//sessio ...

  6. mysql 中翻页

    万变不离其中 select * from tableName where 条件 limit 当前页码*页面容量-1 , 页面容量

  7. 大道至简第一章读后感Java伪代码

    //一.愚公移山 /*原始需求 惩山北直塞,出入之迁也. 项目沟通的方式 聚室而谋 项目目标 毕力平险,指通豫南,达于汉阴 人员组成 愚公,子孙荷担者三夫,邻人遗男 技术方案 叩石垦壤 簸萁运与渤海之 ...

  8. MySql 5.7.20安装

    1.首先上MySql的官网下载  https://dev.mysql.com/downloads/mysql/ 以我所选版本为例(免安装版),选择MYSQL Community Server 然后在右 ...

  9. go 代码的调试---打印调用堆栈

    本文介绍如何打印调用堆栈进行go代码的调试. 打印堆栈使用的runtime package中的Stack()函数 func Stack(buf []byte, all bool) int Stack ...

  10. C# Request.InputStream 读取输入流为空的原因处理

    今天在手机App测试接口的时候发现一个通过POST方式的接口 获取body中的参数一直为空,但是在数据量小的时候却可以获取到数据,开始怀疑是不是POST的长度有限制,然后在web.config中修改了 ...