知识大全 c#基础学习之内存管理

Posted 变量

篇首语:弱龄寄事外,委怀在琴书。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 c#基础学习之内存管理相关的知识,希望对你有一定的参考价值。

  正式学习c# ASP NET已经有半年多了 期间一直在忙一个项目 很少有时间能够看看基础知识 前两天看到一贴子 突然发现自己的基础知识是如此的薄弱 很多问题是 知其然不知其所以然 基础知识的缺失注定达不到你所想要的高度 因此 现在想抽出时间来看看基础 但是自己有不想再去一页一页的看那本那么厚的《c#高级编程》和《ASP NET 高级编程》 所以想到什么地方就看什么地方了 不求顺序 但求效果

  然 看了书后 自己就想写点什么 一是加深理解和印象 二是和园友们共同探讨 自己从来没有写过系列文章 就从这里开始吧 虽然都是写基础的东西 对高手来说都是再简单不过了 但对我这样的新手来说 基础的才是最重要的

  于是 就写这个系列

   内存管理

  c#编程的一个优点是程序员不需要关心具体的内存管理 尤其是垃圾收集器会处理所有的内存清理工作 虽然不必手工管理内存 但如果要编写高质量的代码 还是要理解后台发生的事情 理解c#的内存管理 本文主要介绍给变量分配内存时计算机内存中发生的情况

  c#将数据分为两种 值数据类型和引用数据类型 这两种数据类型存储在内存中的不同的地方 值数据类型存储在堆栈中 而引用类型存储在内存的托管堆中

  一 内存简介

  Windows使用一个系统 虚拟寻址系统 这个系统的作用是将程序可用的内存地址映射到硬件内存中的实际地址上 其实际结果就是 位的机子上每个进程都可以使用 GB的内存 当然 位机这个数字就大了去了 这 GB的内存实际上包含了程序的所有的部分 可执行代码 DLL以及程序运行时使用的所有变量的内容 这个 GB的内存成为虚拟地址空间或虚拟内存 为方便 这里成为内存

   GB中的每个存储单元都是从零开始向上存储的 要访问存储在内存中的某个空间中的值 就必须提供表示该存储单元的一个数字 在高级编程语言中 编译器的一个重要作用就是负责将人们可以理解的变量名称变为处理器可以理解的内存地址

  二 堆栈

  在内存中 有一个区域成为堆栈 存储对象

  对象成员的值数据类型调用方法时 传递给所有方法的参数的副本注意 调用方法时 堆栈存储的是所有参数的副本 因此 经值类型A传递给函数 A的值是不会变化的 当然 引用类型是会变化的 因为在堆栈中存储的是引用类型的地址 这在后面会有详细的介绍

  下面以一个例子来说明堆栈的工作方式 如下面的代码   : : int a; : //do something; : : int b; : //do something : :

  首先声明a 在内部的代码块中声明b 然后内部的代码块终止 b就出了作用域 最后a出作用域 所以b的生命周期总是包含在a的生命周期内 在释放变量的时候 其顺序总是和分配内存的顺序是相反的 即 变量的生存周期都是嵌套的 这就是堆栈的工作方式

  三 托管堆

  堆栈具有相当高的性能 但是变量的生命周期必须是嵌套的 这个要求在有的时候过于苛刻 我们希望有一种别的方法来分配内存 存储一些数据 并在方法退出的很长一段时间内 这些数据仍然是可用的 这时 就使用托管堆

  托管堆(简称堆)是内存中的另外一个区域 我们仍然用一个例子来说明堆的工作方式 如下面代码   : : Customer customer ; : customer =new Customer(); : Customer customer =new Customer(); : //do something :

  首先 声明一个Customer customer 在堆栈上给这个引用分配存储控件 请注意 仅仅是给这个引用分配存储空间 并不是实际的Customer对象 customer 占用 个字节的空间( 位机) 来表示Customer对象在内存中的地址

  然后 执行第二行代码 完成以下操作

  在堆上分配存储空间 用来存储Customer对象 注意 这里是Customer对像

  将变量customer 的值设为分配给Customer对象的内存地址从这个例子中可以看出 建立引用类型的变量的过程要比奖励值类型变量的过程复杂 且不避免的有性能的降低 但是 我们可以将一个引用变量的值赋给另一个引用变量 当一个变量出作用域时 它会从堆栈中删除 但是对象的数据仍然保留在内存中 知道程序停止

  这样 我们在将一个引用变量A传递给函数时 仅仅是将变量A的引用传递给了函数 即 仅仅是在堆栈上分配内存 即变量B 两者指向同一个内存地址 因此 当变量B发生变化时 变量A也会发生变化

  四 装箱和拆箱

  装箱和拆箱就是值类型和引用类型的项目转化 装箱可以将值类型转化为引用类型 拆箱的作用正好相反 经引用类型转化为值类型

  五 垃圾收集

cha138/Article/program/net/201311/11779

相关参考

知识大全 C#语言学习:C#数据报编程之测试程序

C#语言学习:C#数据报编程之测试程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  C#中自定

知识大全 ASP.NET学习笔记之c#必会

ASP.NET学习笔记之c#必会  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nbs

知识大全 基于C#的接口基础教程之六

基于C#的接口基础教程之六  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  继承接口实现  接口具

知识大全 基于C#的接口基础教程之三

基于C#的接口基础教程之三  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  第三节定义接口成员  

知识大全 基于C#的接口基础教程之四

基于C#的接口基础教程之四  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  第四节访问接口  对接

知识大全 基于C#的接口基础教程之五

基于C#的接口基础教程之五  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  第五节实现接口  显式

知识大全 基于C#的接口基础教程之七

基于C#的接口基础教程之七  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  映射接口  类必须为在

知识大全 基于C#的接口基础教程之二

基于C#的接口基础教程之二  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  第二节定义接口  从技

知识大全 C# GDI+编程之基础篇

C#GDI+编程之基础篇  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一关于GDI+  从本质

知识大全 ASP.Net之C#中的异常处理

ASP.Net之C#中的异常处理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  基础知识  程序